Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/254.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 防止sql注入的pdo_Php_Sql Injection - Fatal编程技术网

Php 防止sql注入的pdo

Php 防止sql注入的pdo,php,sql-injection,Php,Sql Injection,我正在尝试将访问者的输入插入数据库。 这是可行的,但是-这足以防止sql注入吗 <?php $db_host = "localhost"; $db_name = "db_qadenza"; $db_user = "root"; $odb = new PDO ("mysql:host=" . $db_host . ";dbname=" . $db_name, $db_user); if(isset($_POST['Submit'])) { $user = $_POST['user'];

我正在尝试将访问者的输入插入数据库。
这是可行的,但是-这足以防止sql注入吗

<?php
$db_host = "localhost";
$db_name = "db_qadenza";
$db_user = "root";

$odb = new PDO ("mysql:host=" . $db_host . ";dbname=" . $db_name, $db_user);

if(isset($_POST['Submit']))
{
$user = $_POST['user'];
$pass = $_POST['pass'];
$mail = $_POST['mail'];
$confirm_key=md5(uniqid(rand()));

$q = "INSERT INTO members (user, pass, mail, confirm_key)
VALUES(:user, :pass, :mail, :confirm_key);";

$query = $odb->prepare($q);
$results = $query->execute(array(
":user"=>$user,
":pass"=>$pass,
":mail"=>$mail,
":confirm_key"=>$confirm_key,
));

exit();
}
?>

是。该方法确保不会发生sql注入,只要用户定义的值作为传递的变量输入(它们是为您提供的)

从链接页面:

如果应用程序专门使用准备好的语句,开发人员可以确保不会发生SQL注入[…]


对。我觉得很好

如果需要,还可以创建其他mysql用户,以在SQL注入事件中限制范围。此时,您正在以
根用户身份连接


还可以考虑使用密码散列方案,例如salt+BCrypt。

您的代码有两个问题

  • 您正在使用模拟的准备语句。这是PDO_MYSQL驱动程序的默认行为。要避免这种情况,您应该添加:

    $odb->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    
    再加上缺少用于与DB通信的字符集,这会使您的代码易于注入。要建立连接,您应使用:

    $odb = new \PDO('mysql:host=localhost;dbname=******;charset=UTF-8', 
                    'user', 'pass');
    
  • 您对密码进行哈希处理的方法不安全(或者实际上不存在)。相反,您应该将函数与
    CRYPT_BLOWFISH
    或一起使用,并为每个密码添加不同的盐


  • 此外,您可以考虑使用方法来命名参数的ALIE,因为通过<代码> ExcUTETE()/代码>设置它们将将值绑定为<代码> PDO::PARAMYSTR ,但是,您可能会发现有用的。

    是的,但是您真的必须保存密码吗?最好用一些含盐的散列来隐藏它@Hawili,我会用一些散列。谢谢。使用“bcrypt”加密您的密码。没问题!从我链接的页面来看,顶部的方法与您的略有不同,但如果您查看示例3,它们会像您一样在execute中传递变量。所以你的方法看起来很安全。