转载自:
1. 数据库的查询时,总是尝试,并使用准备的 parameterised 的查询。mysqli 和 PDO 库支持这。这是比使用逃逸的功能,如 mysql_real_escape_string 无限的安全。
是的 mysql_real_escape_string 实际上是只是逃避函数的字符串。它不是灵丹妙药。它将所做的一切是危险的转义字符,以便它们可以安全地使用单个查询字符串中。但是,如果你不做事先 sanitise 您的输入,然后您将容易受到一定的攻击媒介。
想象一下以下的 SQL:
$result ="SELECT fields FROM table WHERE id = ".mysql_real_escape_string($_POST['id']);
您应该能够看到这就是容易受到攻击。
想象一下 id 参数包含常见的攻击:1 OR 1=1
没有危险的字符,在那里进行编码,所以它将直接通过逃逸的筛选器。离开我们:
SELECT fields FROM table WHERE id=1 OR 1=1
这是一个可爱的 SQL 注入向量和将使攻击者能够返回的所有行。或
1or is_admin=1 order by id limit 1
这会产生
SELECT fields FROM table WHERE id=1or is_admin=1 order by id limit 1
这使得攻击者能够在此完全虚构的示例返回第一个管理员的详细信息。
虽然这些函数是有用的他们必须小心使用。您需要确保所有 web 输入进行都验证,在某种程度上。在这种情况下,我们看到我们可以利用因为我们没有检查变量,我们正在使用的数字,是实际数字。在 PHP 中广泛应使用一组函数检查输入整数、 浮点数、 字母数字等。但是,SQL 时,听取预准备语句的最大价值。上面的代码是不安全的如果它是预准备的语句的数据库功能便会知道, 1 OR 1=1 不是有效的文本。
避免注入的方法:
2. 至于 htmlspecialchars()。这就是它自己的雷场。
有一个真正的问题在 PHP 中有一个整体的不同的 html 相关逃逸功能,并没有明确的指导,究竟哪些功能做什么选择。
首先,如果您是 HTML 标记内,你是在真正的麻烦。看
echo '';
我们已经内部 HTML 标记,所以我们不需要 < 或大于做任何危险的事情。我们的攻击可能只是javascript:alert(document.cookie)
现在生成 HTML 看起来就像
备注: html源码是: