-1

可能重复:
在 PHP 中防止 SQL 注入的最佳方法

我正在尝试将用户的输入插入数据库。
这个 pdo 和哈希是否足够安全:

$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();
4

2 回答 2

4

您似乎对什么是 SQL 注入以及我们为什么要散列密码感到有些困惑。

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

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

防止 SQL 注入的最佳方法是通过PDO 开箱即用的参数化查询;但是,您没有使用它们,因此您的代码很容易受到攻击。阅读有关 PDO 参数化查询的文档;如果您不确定它们是如何工作的,请随时回来再次询问。

于 2012-08-05T12:46:48.863 回答
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);
...

有关更多详细信息,请参见此处

于 2012-08-05T12:45:51.327 回答