为什么请求绕过NULL检查?

时间:2013-10-09 15:40:42

标签: php

我让用户在注册我们的网站时通过电子邮件点击激活链接。该链接看起来像http://www.site.com/?u=123&a=xyz

当用户点击链接时,我的代码会解析$_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
}

如果这些参数不是空的,则会将它们发送到函数以检查数据库的值。

我在此功能中的检查是:

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"]肯定是被设置的(我可以在referer中看到它)。这个问题并不总是发生;这很随意。每天约有140个新帐户中的2-3个。

1 个答案:

答案 0 :(得分:0)

如果只是有时发生,我个人会将$u === NULL替换为empty($u)。我想你只是想检查一下你是否有价值。

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。