当我验证输入时,我正在将字符(包括引号)转换为HTML实体。将它们放入数据库时,我正在使用PDO预处理语句并将变量传递给execute方法。
这足以阻止SQLi和XSS攻击吗?
另外,另一方面,允许热链接图像的最佳方法是什么?因为它们包含斜杠等。我正在考虑检查图像以查看是否包含有效的标题。
由于
答案 0 :(得分:2)
htmlentities()可能已足够或可能不是 - 取决于您插入参数的位置。
E.g。
$p = 'javascript:alert(document.URL)';
echo '<a href="', htmlentities($p), '">';
打印
<a href="javascript:alert(document.URL)">
并没有阻止javascript注入 即使htmlentities()是正确使用的功能,您也必须以“正确的方式”应用它,请参阅http://shiflett.org/blog/2005/dec/google-xss-example
答案 1 :(得分:1)
更具体地说,绑定参数会阻止sql注入(直接将用户输入注入SQL流的预准备语句不足,用户输入需要是绑定参数)
在大多数情况下, htmlentities
(或htmlspecialchars
)足以阻止XSS(还有一些极端情况,例如,如果您将用户输入放入<script>
上下文,包括一个onsomething
事件处理程序)。这些函数阻止用户输入自己的脚本上下文。
答案 2 :(得分:0)
我强烈建议不要将字符转换为实体。对表使用unicode,您可以存储任何字符。此外,您可以轻松搜索数据库中的值,而不会出现任何错误结果。例如。搜索“uml”也会返回任何德语变音符号的每个字符串,例如ü在你之后必须用PHP过滤的字符串中。
您可以使用strip_tags()过滤任何标记,或者只删除&lt; script&gt;在插入数据之前使用正则表达式标记。