我們的用戶在註冊我們的網站時通過電子郵件點擊激活鏈接。鏈接看起來像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個。
你在哪裏指定'$ _GET ['u']'到'$ u'?我真的希望你沒有打開register_globals。 – sevenseacat
@sevenseacat //進入功能區域。我會編輯代碼來反映。 – Mike
因此對於你明顯想玩的問答遊戲的第二輪:'clean_it'做什麼...? – CBroe