pdo和哈希来防止sql注入
可能重复:
防止PHP中的SQL注入的最佳方法
我试图将用户的输入插入到数据库中。
这个pdo和hash是否足够安全:
$dbh = new PDO("mysql:host=hostName; dbname=dbName", "user", "pass");
if(isset($_POST['Submit']))
{
$user = $_POST['user'];
$pass = $_POST['pass'];
$salt = substr(str_replace('+', '.', base64_encode(sha1(microtime(true), true))), 0, 22);
$hash = crypt($pass, '$2a$12$' . $salt);
$mail = $_POST['mail'];
$confirm_key=md5(uniqid(rand()));
$sth = $dbh->prepare("INSERT INTO members(user, pass, mail, confirm_key)
VALUES ('$user', '$hash', '$mail', '$confirm_key')");
$sth->execute();
您正在滥用准备好的声明,将您的代码更改为:
$stmt = $dbh->prepare("INSERT INTO members(user, pass, mail, confirm_key) VALUES (:user, :hash,:mail,:confirm)");
$stmt->bindParam(':user', $user);
$stmt->bindParam(':hash', $hash);
...
详情请看这里。
对于什么是SQL注入以及为什么我们需要散列密码,您似乎有点困惑。
密码哈希(和腌制)完成后,数据库包含足够的信息来验证密码,但不足以检索它。 如果攻击者获得(离线)访问数据库的权限,她仍然无法读出任何密码而不破解安全哈希。 为此,你的代码看起来很合理。
SQL注入是一个完全不同的野兽。 漏洞通过向您的PHP代码发送值,当插入到动态SQL查询中时,它会以有趣的方式破坏它,以便查询现在可以完成与它打算做的不同的事情。 例如,用户可以为$user
提供一个保持INSERT
查询有效的值,但是会跳出引用的字符串并添加第二个查询,这可能会造成一些有害影响,例如用已知值覆盖其他用户的密码哈希值,之后攻击者可以登录他们想要的任何账户(包括行政账户)。
防止SQL注入的最好方法是通过参数化查询 ,这是PDO提供的开箱即用功能; 你并没有使用它们,所以你的代码很脆弱。 阅读有关PDO参数化查询的文档; 如果您不确定自己的工作方式,请随时回来再问一次。
链接地址: http://www.djcxy.com/p/93977.html