2012-01-15 112 views
0

對於我的電子郵件確認腳本,我通過使用現有的單向加密功能運行用戶的電子郵件地址,然後從中間抓取20個字符來生成令牌。我以$ _GET變量或$ _POST變量的形式從用戶那裏獲取令牌。我遇到了一個「錯誤」,其中當輸入的電子郵件地址中有一個加號(+),然後該標記作爲$ _GET變量從用戶處取回時,加號會轉換爲空格,並且哈希變化,因此令牌不再匹配。

所以,我想知道什麼是解決這個問題的最佳方法是什麼?逃避加號?轉換加號? URL編碼?當我使用$ _GET時,會發生哪些其他字符?

下面是相關的代碼,如果它是有幫助的:

<?php 
if (isset ($_GET['email'], $_GET['token'])) { 
    $email = strtolower (mysql_real_escape_string($_GET['email'])); 
    $token = mysql_real_escape_string($_GET['token']); 
    $correctToken = substr (doEncrypt ($email), -26, -6); 
}elseif (isset ($_POST['submit'])) { 
    $email = strtolower (mysql_real_escape_string($_POST['email'])); 
    $token = mysql_real_escape_string($_POST['token']); 
    $correctToken = substr (doEncrypt ($email), -26, -6); 
} 

if (isset ($email, $token, $correctToken)){  
    if ($token == $correctToken) { 
     // Confirm user's email! 
    } 
} 
?> 

非常感謝您! Billy

編輯:好的,所以在這一點上最大的問題是,加號是通過$ _GET檢索時轉換爲空格的唯一字符?如果是這樣,那麼看來我可以在$ _GET部分添加它:$email = str_replace(' ', '+', $email);在電子郵件地址中沒有其他的原因,對吧?再次

感謝, 比利

+2

是的,['urlencode'](http://php.net/urlencode)將是最合適的(在每個電子郵件發送該URL之前)。 – mario 2012-01-15 04:57:25

+0

可能重複的[PHP的加號查詢](http://stackoverflow.com/questions/2671840/php-plus-sign-with-get-query) – mario 2012-01-15 05:00:27

+0

可能的重複[在PHP中提交字符串時數據庫應該照顧非法字符使用htmlspecialchars()或使用正則表達式?](http://stackoverflow.com/questions/2993027/in-php-when-submitting-strings-to-the-database-應該 - 我非常重視) – 2012-01-15 05:32:28

回答

0

如果是我,我會做一個str_replace()散列之前加號轉換爲空格。將str_replace()置於散列函數內;這樣用戶的電子郵件地址只能在函數的範圍內修改,並且對於腳本的其餘部分保持不變。

function hash_email($email) 
{ 
    $email = str_replace('+', ' ', $email); 

    ...hashing stuff happens here... 

    return $token; 
} 

$token = hash_email($_GET['email']); 
+0

唯一的問題是,我不得不在幾個地方做這件事,然後也擔心在某個時候給用戶使用不正確的電子郵件。在計算正確的標記之前,將空格轉換爲加號是什麼?我可以在'if(isset($ _GET ['email'])''部分中做到這一點?看我的編輯。感謝您的回覆@njbair! – JeepFreak 2012-01-15 14:39:44

+0

修改爲包含示例代碼。 – njbair 2012-01-15 20:36:42

+0

完美!非常感謝! – JeepFreak 2012-01-16 17:09:44