因此,我正在一个项目中,我必须在其中修复现有代码中的漏洞。在修复这些问题的过程中,我需要从[
更改底部代码中的SQL查询。$query="SELECT COUNT(userID) as count,userID FROM user WHERE Email='$email' AND password='".md5($password)."' ";
to
$query="SELECT COUNT(userID) as count,userID FROM user WHERE Email='$email' AND password_verify($password, password)=1";
因为本来我应该切换到比MD5更安全的算法,并且该算法也使用盐,所以BCRYPT会选中这两个框。我对SQL还是很陌生,处于一个无法实际测试此代码的独特位置,因为password_hash和password_verify函数仅在PHP 5.5和更高版本中使用,并且此项目正在运行的WAMPserver版本上运行只能使用较旧的版本,因此我只需要知道这些代码在理论上是否可以工作,因为我无法对其进行测试。我将查询中的md5函数替换为password_verify函数,该函数应确定password参数是否为数据库中存储的密码的原始版本。但是我不知道是否需要使用转义字符或函数附近的内容,或者在该查询中是否可以正常使用。
function login_check($email, $password){
$email=mysql_real_escape_string($email);
$query="SELECT COUNT(userID) as count,userID FROM user WHERE Email='$email' AND password_verify($password, password)=1";
$result= mysql_query($query) or die($query."<br/><br/>".mysql_error());
return (mysql_result($result,0)==1) ? mysql_result($result,0,'userID') : false;
}
您无法从MySQL调用PHP函数。您需要获取密码并在PHP中调用password_verify()
。
function login_check($email, $password) {
$email = mysql_real_escape_string($email);
$query="SELECT userID, password FROM user WHERE Email='$email'";
$result= mysql_query($query) or die($query."<br/><br/>".mysql_error());
$count = 0;
while($row = mysql_fetch_assoc($result)) {
if (password_verify($password, $row['password'])) {
$count++;
$userid = $row['userID'];
}
}
if ($count == 1) {
return $userid;
} else {
return false;
}
}