空和isset检查中的sql注入漏洞

时间:2013-07-26 11:45:29

标签: php sql

我正在努力使我的网站注入证明,并且想知道我正在进行的验证,我的代码是这样的:

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

我的问题是不是空检查本身就是一个漏洞? 我的意思是我必须在!空验证中转义字符串吗?或者这样保持安全吗? 感谢。

2 个答案:

答案 0 :(得分:2)

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

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

mysql_real_escape_string将防止SQL注入if done correctly但根本不应该使用,因为mysql_前缀/数据库处理程序已过时,已弃用且根本不应使用< / strong>即可。 最安全的方法是使用mysqli_PDO,并使用预准备语句。

答案 1 :(得分:2)

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函数本身不容易受到攻击。


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