2011-11-17 62 views
6

我有一个更新用户数据的表单。它发布到这个页面:查询产生意想不到的结果(sha1)

<?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); 
?> 

(我已经编辑了东西不相关的这个问题)

我相信所发生的事情是,当“戳”领域正在被使用$盐填充它正在计算$ 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 我想知道一个值的$盐保留价值当它在$ hash中使用时,以及在更新字段'stamp'时是相同的。 任何人都可以帮助我或指出我在正确的方向吗?提前致谢。 干杯

+0

检查PHP是否插入了错误的散列或者MYSQL正在寻找错误的散列。这将把问题空间分解成一半。 –

+0

正在插入错误的散列。我认为当密码被哈希时$ salt的值和$ salt在数据库中插入时的值是有区别的,但我并不确定。 – Spud

+0

user_passwrd的列定义是什么? – Ben

回答

0

谢谢你的所有意见。我想报告说我解决了这个问题。我晚上一晚晚些时候更改了密码输入字段的名称,忽略了更改$ _POST值。当然,这并没有为$ hash提供$密码值。尽管我对此感到尴尬,但我认为对我来说,分享我的监督来证明检查所有可能出现错误的地方的重要性是非常重要的。我没有仔细检查一切,并对问题的性质作出了不正确的假设。代码工作正常,键盘前面松动的螺丝导致了问题。干杯

1

更多的想法,所以我已经改变了我的意见为答案...

值得一提的是您正在使用PHP的SHA1函数存储时,但MySQL的检索时。他们应该是一样的,但这是我想要调试的第一个地方。尝试使用mysql的sha函数来存储散列或根据登录检索记录,读取salt并将其散列在PHP中进行比较

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

除了您的评论,您是否可以发布表中相关字段的模式?

+0

user_passwrd \t VARCHAR(60)\t否/ \t 邮票\t INT(50)\t不......是否有可能$盐的值是密码被散列的时间和它被插入到“戳的时间之间的不同'字段? – Spud

+0

它不应该是 - 如果你直接(两次)调用'time()',那么是的,但你将它存储在一个变量之后,它只是一个数字。尝试在MySQL INSERT后输出'$ salt',然后将它与存储在Db – Basic

+0

中的值进行比较,我检查它的结果和更新函数前后的值相同。现在我真的很难过。 – Spud

-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可能会有点棘手。我希望这有帮助。

+0

这是不正确的。反引号是绝对没有必要的(哎呀,我甚至建议不要使用它们),并且当你使用双引号时你不必连接。 –

+0

过去,这样做对我有帮助。我不完全确定为什么,但是当我改变它以反推并连接变量时,一切都奏效了。所以,我一直这样做了一段时间。谁说这不会帮助他?我没有看到你回答这个问题。我只是想帮忙。 – jpferrierjr

+1

当然你是,但你必须知道你在做什么。我不是想打你或什么。反引号的目的基本上是“逃避”列,表或数据库名称。这允许您在结构名称中使用特殊字符(如空格),或者使用保留关键字。在这种情况下,显式连接将不会做任何事情,因为它与OP的代码完全相同。查询本身起作用,问题是不正确的数据。 (1) –

相关问题