我正在尝试将访问者的输入插入数据库。
这可行,但是 - 这足以防止 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();
}
?>
您的代码有两个问题。
-
您正在使用模拟的准备好的语句。这是 PDO_MYSQL 驱动程序的默认行为。为了规避它,你应该添加:
$odb->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
与与数据库通信时缺少的字符集结合使用,这可能会使您的代码容易受到注入。为了建立连接,您应该使用:
$odb = new \PDO('mysql:host=localhost;dbname=******;charset=UTF-8',
'user', 'pass');
您的散列密码方法不安全(或者实际上不存在)。相反,你应该使用crypt() http://uk.php.net/manual/en/function.crypt.php功能与CRYPT_BLOWFISH
or PBKDF2 http://en.wikipedia.org/wiki/PBKDF2每个密码都有不同的盐。
另外,您可能会考虑使用bindParam() http://php.net/manual/en/pdostatement.bindparam.php设置命名参数值的方法,因为通过设置它们execute()
将值绑定为PDO::PARAM_STR
, 但是这里有其他选项 http://php.net/manual/en/pdo.constants.php,您可能会发现有用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)