2011-11-17 97 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) –

相關問題