2013-10-09 89 views
-2

我們的用戶在註冊我們的網站時通過電子郵件點擊激活鏈接。鏈接看起來像http://www.site.com/?u=123&a=xyz爲什麼請求繞過NULL檢查?

當用戶點擊鏈接時,我的代碼會解析$_GET["u"]$_GET["a"]參數。該代碼確保沒有什麼惡意,什麼不是。此代碼還會檢查$_GET["u"]是否已設置和定義。如果它是空的,它會吐出一條錯誤消息。

if(isset($_GET["u"]) && ($_GET["u"] !== "") && is_numeric($_GET["u"]) { 
    // proceed to function 
    $u = clean_it($_GET["u"]); 
} else { 
    // show error screen 
} 

如果這些參數不爲空,它們會被髮送到一個函數來檢查db的值。

我的檢查,這個函數中,是:

if($u === NULL) { 
    return FALSE; 
} else { 
    // check $u against the db 
    $sql = "SELECT * FROM users WHERE user_id=$u LIMIT 1;"; 
} 

所以,當請求到來時,它會立即將功能和擊球的SQL調用。我的查詢,從這些請求,看起來像:

SELECT * FROM users WHERE user_id=NULL LIMIT 1; 

爲什麼會發生這種情況?有任何想法嗎? $_GET["u"]肯定是正在設置的(我可以在引用程序中看到它)。這個問題並不總是會發生;它非常隨機。每天約140個新帳戶中可能有2-3個。

+4

你在哪裏指定'$ _GET ['u']'到'$ u'?我真的希望你沒有打開register_globals。 – sevenseacat

+0

@sevenseacat //進入功能區域。我會編輯代碼來反映。 – Mike

+4

因此對於你明顯想玩的問答遊戲的第二輪:'clean_it'做什麼...? – CBroe

回答

0

如果只是有時候發生,我個人會用empty($u)代替$u === NULL。我認爲你只是試圖檢查你在那裏是否有價值。

if(!empty($_GET['u']) && is_numeric($_GET["u"]) { 
    // proceed to function 
    $u = clean_it($_GET["u"]); 
} else { 
    // show error screen 
} 

if(empty($u)) { 
    return FALSE; 
} else { 
    // check $u against the db 
    $sql = "SELECT * FROM users WHERE user_id=$u LIMIT 1;"; 
} 

當然,因爲你只給了代碼片段也可能是您的變量被刪除別的地方我們沒有看到。

在旁註 - 構建這樣的查詢是一個壞主意。研究PHP的PDO。

+0

'empty'將字符串'0'視爲沒有值 - 這通常是不可取的。 (我發現我通常希望將空字符串視爲null,但將數字0視爲一個值 - 因爲這對我的用戶來說就是這樣。) – Brilliand