我目前正在制作我的站点注入证明,并想知道我正在进行的验证,我的代码如下:
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,并使用准备好的语句。