pdo和hash来防止sql注入

时间:2012-08-05 12:38:41

标签: php sql-injection

  

可能重复:
  Best way to prevent SQL Injection in PHP

我正在尝试将用户的输入插入数据库 这个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();

2 个答案:

答案 0 :(得分:4)

您似乎对SQL注入是什么以及我们为什么要使用密码进行混淆而感到困惑。

密码散列(和salting)已完成,因此数据库包含足够的信息来验证密码,但不足以检索密码。如果攻击者获得(离线)访问数据库的权限,她仍然无法在不破解安全哈希的情况下读出任何密码。为此,您的代码看起来很合理。

SQL注入是一个完全不同的野兽。该漏洞利用程序通过向PHP代码发送值来实现,当插入到动态SQL查询中时,它将以有趣的方式打破它,以便查询现在执行与预期不同的操作。例如,用户可以为$user提供保持INSERT查询有效的值,但会突破引用的字符串并添加第二个查询,这可能会造成一些有害的事情,例如覆盖其他所有用户的具有已知值的密码哈希,之后攻击者可以登录到他们想要的任何帐户(包括管理帐户)。

防止SQL注入的最佳方法是通过参数化查询,PDO提供开箱即用的功能;你没有使用它们,所以你的代码容易受到攻击。阅读documentation on PDO's parametrized queries;如果你不确定它们是如何工作的,请随时回来再问。

答案 1 :(得分:2)

您正在滥用准备好的声明,将您的代码更改为:

$stmt = $dbh->prepare("INSERT INTO members(user, pass, mail, confirm_key) VALUES (:user, :hash,:mail,:confirm)");
$stmt->bindParam(':user', $user);
$stmt->bindParam(':hash', $hash);
...

有关详细信息,请参阅here