【问题标题】:password_verify won't work [closed]password_verify 不起作用[关闭]
【发布时间】:2015-09-16 20:15:00
【问题描述】:

这是我的代码: --registered.php -- 此文件将新用户的用户名和密码发送到数据库

<?php include "config.php"; ?>
<?php 
    $username = $_POST['username'];
    $email = $_POST['email'];
    $mypassword = $_POST['password'];
    $defaultrank = "user";
    $password=password_hash($mypassword, PASSWORD_BCRYPT);
?>


<?php if(isset($_REQUEST['submit'])) { ?>
<?php
$sql = "INSERT INTO usr (username, password, email, rank)
VALUES ('$username', '$password', '$email', '$defaultrank')";

if ($conn->query($sql) === TRUE) { ?>


<meta http-equiv="refresh" content="0; url=register.php#registrationsuccess" />

<?php }
else{ ?>
<meta http-equiv="refresh" content="0; url=register.php#registrationfailed" />
<?php } ?>





<?php $conn->close(); ?>
<?php } ?>

-- redir.php -- 这会将登录信息发送到数据库进行验证

<link rel="stylesheet" href="css/font-awesome.min.css">
<?php
session_start();
ob_start();
$host="localhost";
$user="root"; 
$pass="root"; 
$db="usr";  
$tbl="usr"; 

mysql_connect("$host", "$user", "$pass")or die("cannot connect"); 
mysql_select_db("$db")or die("cannot select DB");
include 'registered.php';

$myusername=$_POST['myusername']; 
$user = $myusername;
$mypassword=$_POST['mypassword']; 
$pass = $mypassword;
// $password=md5($mypassword);
$hashAndSalt = password_hash($password, PASSWORD_BCRYPT);
$savemyusername = $myusername;
$savemypassword = $mypassword;

$myusername = stripslashes($myusername);
$mypassword = stripslashes($mypassword);
$myusername = mysql_real_escape_string($myusername);
$mypassword = mysql_real_escape_string($mypassword);

$sql="SELECT * FROM $tbl WHERE username='$myusername' and password='password_verify($password, $hashAndSalt)'";
$result=mysql_query($sql);

$count=mysql_num_rows($result);
if($count==1){
// Sessions //
$_SESSION["pass"] = $pass;
$_SESSION["user"] = $user;
// END //
echo <<<EOF
<meta http-equiv="refresh" content="0; url=membersarea.php" />
EOF;
}

else { ?>
<meta http-equiv="refresh" content="0; url=login.php#loginfailed" />
<?php 
}

ob_end_flush();
?>

登录系统可以在 md5 下正常工作 此外,registered.php 中的数据也被发送到数据库,它只是验证问题所在的数据

【问题讨论】:

  • 这些是一些可爱的sql injection attack 漏洞。您是否打算让您的登录系统完全无用且容易被绕过?
  • 密码散列和 20 世纪 MySQL API 的讽刺组合。
  • 顺便说一句 password='password_verify($password, $hashAndSalt)' 让你失望了 - 将预期的函数用作字符串文字。
  • 仅供参考:MD5 生成的字符串长度为 32 个字符。密码哈希 60。
  • Marc 这将被修复

标签: php hash


【解决方案1】:
$sql="SELECT [..snip..] and password='password_verify($password, $hashAndSalt)'";
                                      ^^^^^^^^^^^^^^^

你不能在字符串中嵌入 PHP 代码并期望 PHP 执行它,MySQl 也不会为你执行 PHP 代码,因为 MySQL 完全不知道 PHP 是什么。

即使那个 php 函数调用神奇地以某种方式被执行,它也只能返回一个布尔值,所以你的代码(在魔法王国中)归结为两种可能性:

... password = false
... password = true

【讨论】:

  • 我该怎么做,把它放到一个var中,然后把var放在那里还是???
  • 从sdb中选择hash,然后if (password_verify($password, $hash_from_db)),这纯粹是一个PHP的东西。
  • 我想这样做,但我不太确定如何从数据库中实际获取哈希
  • select ... 它,就像你对数据库中的任何其他数据一样......
猜你喜欢
  • 2018-02-27
  • 1970-01-01
  • 1970-01-01
  • 2015-11-16
  • 2017-06-18
  • 2022-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多