2012-06-08 52 views
0

你好,我正在嘗試創建一個帳戶激活頁面,但是當我嘗試激活一個帳戶時,它的工作原理是兩次。所以基本上我的激活鏈接使用用base64_encode()編碼的用戶id和用crypt編碼的用戶pass(s​​ha512)。所以我的註冊頁面上的代碼如下所示:如果PHP奇怪的錯誤?

$qry = "SELECT * FROM users WHERE username='$username'"; 
    $res = mysql_query($qry); 
    $row = mysql_fetch_row($res); 
    $userid=$row[0];//gets the id of the user 
    $userpass=$row[2];//gets the pass from database (which is already encoded) 
    $userid=base64_encode($userid); //encodes userid 
    $code=substr($userpass,6,strlen($userpass)-6); // cuts off some $6$xx$ information which is needed for crypt. 
    $message="//here is some message and then the link 
    http://www.xxx.be/forum/confirm.php?userid=".$userid."&code=".$code; 

    mail($email , "xxx registration confirmation" ,$message,"From:[email protected]"); 

這是我在confirm.php使用的代碼:

$userid=base64_decode($_GET['userid']); 
$qry = "SELECT * FROM users WHERE id='$userid'"; 
$res = mysql_query($qry); 
$row = mysql_fetch_row($res); 
if ($userid%2==0) { 
$pass=substr($row[2],0,strlen($row[2])-1); 
} else { 
$pass=$row[2]; 
} 
if ($pass=="$6$10$".$_GET['code']) { 
$qry = "UPDATE users SET activated=1 
WHERE id=$userid"; 
$res = mysql_query($qry); 

所以這纔是我的問題:(在confirm.php線5-9 )我不明白爲什麼我必須這樣做。 每次我創建一個帳戶,它只有在用戶名奇怪時纔有效。如果它甚至爲密碼添加了一個點。 所以這樣的事情:
userid:1 password:something
userid:2 password:stackoverflow。

所以這就是爲什麼$ pass沒有加上「$ 6 $ 10 $」。$ _ GET ['code']並且整個代碼都失敗了。我特別不知道爲什麼當我的用戶ID是0時添加點。 ps:confirm.php中的第5-9行解決了這個問題。但我只想知道它爲什麼這樣做。

編輯:請在回答之前閱讀全文。

+4

您的代碼易受SQL注入攻擊。請不要使用舊的'mysql_ *'函數,並切換到MySQLi或PDO中的參數化查詢。 – Polynomial

+0

_「所以這裏出現我的問題:[...]每當我創建一個帳戶時,它只在用戶名奇怪時才起作用,如果它甚至爲密碼添加了一個點。」_然後顯示存儲用戶的代碼。 – CodeCaster

+0

那麼,if($ userid%2 == 0)'的意圖是什麼?我並沒有完全明白你在那裏做什麼,但它可能是你的奇數/偶數用戶ID問題的根源。 – halfer

回答

0
if ($userid%2==0) { 
    $pass=substr($row[2],0,strlen($row[2])-1); 
} else { 
    $pass=$row[2]; 
} 

這種說法是無用的,它是什麼是打破你的代碼。如果userid ==偶數,那麼它將截斷$ row [2]字符串中的最後一個字符。

要解決,你可以只取出if語句,並有

$pass = $row[2]; 

另外,作爲一個側面說明,有人曾評論,你應該考慮使用預處理語句以防止SQL注入。或者至少在在將它們放入查詢之前對所使用的$ _GET變量進行清理。

+0

嗯,這是我整個職位是關於。如果我刪除這些代碼,那麼它會在密碼爲偶數的情況下添加一個點。 –