Php 使用PDO准备的语句插入密码哈希

Php 使用PDO准备的语句插入密码哈希,php,mysql,pdo,Php,Mysql,Pdo,在基本的mysql插入中,您可以设置密码变量“password($password)”,但这会破坏PDO语句 在使用pdo::prepare和pdo::execute时,如何散列密码 $sql= "INSERT INTO contractors (userid, password, name) VALUES ('$userid', '$pass1', '$name')"; $result = $dbh->prepare($sql); $count = $result->execute

在基本的mysql插入中,您可以设置密码变量“password($password)”,但这会破坏PDO语句

在使用pdo::prepare和pdo::execute时,如何散列密码

$sql= "INSERT INTO contractors (userid, password, name) VALUES ('$userid', '$pass1', '$name')";
$result = $dbh->prepare($sql);
$count = $result->execute();

Echo $count."<br>";
$sql=“插入承包商(userid、密码、名称)值(“$userid”、“$pass1”、“$name”)”;
$result=$dbh->prepare($sql);
$count=$result->execute();
Echo$count。“
”;
我就是这样一个n00b,一个简单的注册页面花了我两天的时间。欢迎幼儿园的回答


谢谢,

如果要使用MD5进行哈希运算,可以在构造SQL语句之前使用密码执行以下操作:

$pass1 = md5($pass1);
$sql = "INSERT INTO contractors ( userid, password, name ) VALUES ( '$userid', '$pass1', '$name' )";
$result = $dbh->prepare($sql);
$count = $result->execute();

echo $count."<br>";
$pass1=md5($pass1);
$sql=“插入承包商(用户名、密码、名称)值(“$userid”、“$pass1”、“$name”)”;
$result=$dbh->prepare($sql);
$count=$result->execute();
echo$count。“
”;
即使它是另一个散列函数,想法也是一样的。在构造SQL语句之前对密码进行哈希运算

正如和在下面的评论中所指出的,选择SHA哈希,因为它更安全


如果您创建自己的哈希,可能会更安全(而且可能更简单)。在我看来,最好的解决方案是通过连接表中的几个字段来创建哈希,如下所示:

$pass1 = sha1($pass1.$name);
注意:如上所述,md5不是saffest解决方案,因为目前互联网上有很多数据库都有与md5哈希变量相关联的关键字,这使得想要入侵您的系统的人更容易

注 这个答案最初建议使用无盐散列。这在当今是愚蠢的,所以它被改写以将其带入现代时代。请注意在这里的旧内容中出现类似的错误答案

您正在使用PDO,因此应该使用带有占位符的参数化查询:

$sql= "INSERT INTO contractors (userid, password, name) VALUES (?, ?, ?)";
$result = $dbh->prepare($sql);
$count = $result->execute(array($userid, $pass1, $name));

echo $count."<br>";
验证密码就像使用相同的参数重建散列一样简单

$sth = $dbh->prepare('SELECT password, salt FROM contractors WHERE userid = ?');
$sth->execute(array($userid));
list($existing_hash, $salt) = $sth->fetch(PDO::FETCH_NUM);
unset($sth);

$new_hash = crypt($pass1, '$2a$07$' . $salt);
if($new_hash === $existing_hash) {
    echo "Password matched.";
} else {
    echo "Password did not match.";
}

使用这样的变量替换会使你的应用程序容易受到SQL注入攻击,除非你在粘贴代码之前转义$userid和lot

最好使用PDO的替换能力(我的意思是,你已经在打电话了。准备):

我不确定像这样内联PASSWORD()是否有效——如果我错了,请纠正我。如果您想采用Alan的方法,而不是依靠MySQL散列您的密码(wise),您也可以这样做:

$sql = "INSERT INTO contractors (userid, password, name) VALUES (?, ?, ?)";
$query = $dbh->prepare($sql);
$dbh->execute(array($userid, sha1($hashed), $name));
也可以考虑使用盐:

$hashed = sha1("SaltedPassword" . $pass1);

鉴于以上,我建议使用SHA(因为它的裂纹较少),并使用盐。是的,SHA可能更好,尤其是用盐。(我个人使用它们。)值得明确指出的是:这故意不使用MySQL的
PASSWORD()
函数
PASSWORD()
只供MySQL自己使用,不供在应用程序中创建密码的开发人员使用
md5()
sha1()
的工作方式基本相同,但更安全。您可以从PHP或MySQL调用任何一个函数。谢谢你的提示和帮助。我将学习sha1()。多亏了艾伦和菲亚尔。我很感激。-1-正如Joe Phillips提到的,他应该使用占位符您应该使用bindParam()来输入这些参数。做得好,比我快。你说得也比我好。我想你的execute()参数应该是一个数组。这更简单,更好的是使用bindParam(),我认为bindParam()很愚蠢。只有PHP是这样做的,它使代码变得不那么优雅。如果你打算永远不修改代码,那就太傻了。依靠索引来匹配参数所需的位置从来都不是一个好主意,简单地连接多个可变长度字段来代替salt可能会使应用程序受到一些不寻常的模拟攻击。
$sql = "INSERT INTO contractors (userid, password, name) VALUES (?, PASSWORD(?), ?)";
$query = $dbh->prepare($sql);
$dbh->execute(array($userid, $pass1, $name));
$sql = "INSERT INTO contractors (userid, password, name) VALUES (?, ?, ?)";
$query = $dbh->prepare($sql);
$dbh->execute(array($userid, sha1($hashed), $name));
$hashed = sha1("SaltedPassword" . $pass1);