空检查和isset检查中存在sql注入漏洞


sql injection vulnerabilities in empty and isset checks

我目前正在制作我的站点注入证明,并想知道我正在进行的验证,我的代码如下:

if(!empty($_POST['city']) && !empty($_POST['street'])){
  $city = htmlentities(mysql_real_escape_string($_POST['city']));
  $street = htmlentities(mysql_real_escape_string($_POST['street']));   
}

我的问题是,空头支票本身不是一个漏洞吗?我的意思是,我必须逃离字符串!是否也为空验证?还是保持这种状态是安全的?谢谢

SQL注入漏洞的工作原理如下:

$username = $_GET["username"];
mysql_query("SELECT 1 FROM `users` WHERE `username` = '" . $username . "'");

现在,如果$_GET["username"]的值类似于"foo' OR 1=1--"

查询:

SELECT 1 FROM `users` WHERE `username` = 'foo' OR 1=1
--'

将运行,选择所有用户

如果您逃避输入,您将得到(预期的)查询:

SELECT 1 FROM `users` WHERE `username` = 'foo'' OR 1=1--'

PHP函数本身并不易受攻击。


也许这是一个很好的类比:当有人说"说出你的名字"时,他们希望你说"我是约翰"而不是"你的名字"

对于SQL注入,您只需要在查询数据库时担心,因此isset是安全的。

应该不需要htmlentities(将其用作XSS的保护)。

如果操作正确,mysql_real_escape_string将防止SQL注入,但根本不应该使用,因为mysql_ prefix/DB处理程序已经过时,不推荐使用,根本不应该用。最安全的方法是使用mysqli_或PDO,并使用准备好的语句。