htmlentities和PDO准备好的语句是否足以阻止XSS和SQLi?

时间:2010-08-30 12:33:01

标签: php

当我验证输入时,我正在将字符(包括引号)转换为HTML实体。将它们放入数据库时​​,我正在使用PDO预处理语句并将变量传递给execute方法。

这足以阻止SQLi和XSS攻击吗?

另外,另一方面,允许热链接图像的最佳方法是什么?因为它们包含斜杠等。我正在考虑检查图像以查看是否包含有效的标题。

由于

3 个答案:

答案 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;在插入数据之前使用正则表达式标记。