我正在努力使我的网站注入证明,并且想知道我正在进行的验证,我的代码是这样的:
if(!empty($_POST['city']) && !empty($_POST['street'])){
$city = htmlentities(mysql_real_escape_string($_POST['city']));
$street = htmlentities(mysql_real_escape_string($_POST['street']));
}
我的问题是不是空检查本身就是一个漏洞? 我的意思是我必须在!空验证中转义字符串吗?或者这样保持安全吗? 感谢。
答案 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函数本身不容易受到攻击。
也许这是一个很好的类比:当有人说“说出你的名字”时,他们希望你说“我是约翰”而不是“你的名字”