查询产生意外结果(sha1)

时间:2011-11-17 23:58:39

标签: php mysql

我有一张更新用户数据的表单。它发布到这个页面:

<?php
    //Update user table
    session_start();
    include 'sql_connect_R.inc.php';

    $id = mysql_real_escape_string($_POST['userID']);
    $password = mysql_real_escape_string($_POST['user_passwrd']);

    $salt = time();
    $hash = sha1($password . $salt);

    mysql_query("UPDATE users SET user_passwrd = '$hash', stamp = '$salt', pending = 'yes'
    WHERE userID = '$id'");

    mysql_close($con);
?>

(我已经删除了与此问题无关的内容)

我相信正在发生的事情是当'stamp'字段填充$ salt时,它获得的值与计算$ hash时的值不同。因此,当用户登录并在此处进行检查时:

$qry="SELECT * FROM users WHERE userlogin = '$login' AND user_passwrd = sha1(CONCAT('$password', stamp))";
    $result=mysql_query($qry);
    $row = mysql_fetch_assoc($result);
    $num = mysql_num_rows($result);

当我回显$ num时,它返回值0。 我想知道是否有办法确保$ salt的值在$ hash中使用时保持不变,然后更新字段'stamp'时。 任何人都可以帮助我或指出我正确的方向吗?提前致谢。 干杯

3 个答案:

答案 0 :(得分:1)

更多想法让我把评论改为答案......

值得注意的是,在存储时使用PHP的SHA1函数,但在检索时使用mysql。它们应该是相同的,但这是我想要调试它的第一个地方。尝试使用mysql的sha函数存储哈希或根据登录检索记录,读取盐并在PHP中哈希进行比较

您如何存储时间戳?是否有可能以某种方式将其转换/舍入/剪裁/视为日期字符串?只是为了进行健全性检查,在两个步骤中将您输入的字符串输入sha1函数并检查它们是否相同。

根据您的评论,您是否可以在表格中发布相关字段的架构?

答案 1 :(得分:0)

感谢您的所有评论。我想报告我已“解决”了这个问题。我在一天晚上更改了密码输入字段的名称而忽略了更改$ _POST值。当然,这样做并没有为$ hash提供$ password值。虽然我对此感到尴尬,但我认为分享我的疏忽很重要,以说明检查可能发生错误的所有地方的重要性。我没有仔细检查所有内容,并对问题的性质做出了错误的假设。代码工作正常,键盘前面的松动螺丝导致了问题。干杯

答案 2 :(得分:-1)

您的查询不正确。您需要连接字符串中的变量而不使用单引号。使用1键``左边的引号。这是大多数MySQL读取查询的方式。例如:

<?php
      //Update user table      
session_start();      
include 'sql_connect_R.inc.php';        
$id = mysql_real_escape_string($_POST['userID']);      
$password = mysql_real_escape_string($_POST['user_passwrd']);        
$salt = time();      
$hash = sha1($password . $salt);        
mysql_query("UPDATE `users` SET `user_passwrd` = '".$hash."', `stamp` = '".$salt."', `pending` = 'yes' WHERE `userID` = '".$id."'");        
mysql_close($con);  
?> 

$qry="SELECT * FROM `users` WHERE `userlogin` = '".$login."' AND `user_passwrd` = '".sha1(CONCAT($password, stamp))".'";        
$result=mysql_query($qry);        
$row = mysql_fetch_assoc($result);        
$num = mysql_num_rows($result); 

这一点变化应该会有所帮助。有时db可能有点敏感。我希望这有帮助。