2010-08-30 67 views
2

当我验证输入时,我将包括引号在内的字符转换为HTML实体。将它们放入数据库时​​,我正在使用PDO准备好的语句并将变量传递给execute方法。htmlentities和PDO准备好的语句足以阻止XSS和SQLi吗?

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

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

由于

+1

http://stackoverflow.com/questions/2959384/ways-i-can-protect-正确的函数my-site-excluded-xss-and-sql-injection – 2010-08-30 12:35:40

+2

这是关于给定月份的这种类型的第20个问题。 – 2010-08-30 12:36:11

回答

1

更具体地,结合的参数防止SQL注入(其中直接注入用户输入到SQL流的准备语句是不够的,用户输入需要被绑定的参数)

htmlentities(或htmlspecialchars)足以在大多数情况下阻止XSS(如果您将用户输入放入<script>上下文中(包括onsomething事件处理程序),仍然存在一些转角情况。这些函数阻止用户能够输入他们自己的脚本上下文。

+0

我会建议'htmlspecialchars'。 'htmlentities'只会向你购买一些东西,如果你还没有以正确的字符集('UTF-8')传输页面的话。 'htmlspecialchars'是为了逃避xml(以及html)的敏感字符...... – ircmaxell 2010-08-30 12:47:01

0

我强烈建议不要将字符转换为其实体。使用unicode为你的表格,你可以存储任何字符。此外,您可以轻松搜索数据库中的值,而不会有任何错误结果。例如。搜索“uml”也会返回带有任何德语变音符号的每个字符串,例如ü这个字符串,你必须用PHP过滤。

您可能只是使用strip_tags()过滤任何标签,或者在插入数据之前使用正则表达式删除<脚本>标签。

2

htmlentities()可能已经足够或者可能不是 - 取决于您插入参数的位置。

E.g.

$p = 'javascript:alert(document.URL)'; 
echo '<a href="', htmlentities($p), '">'; 

打印

<a href="javascript:alert(document.URL)"> 

,并没有阻止JavaScript注入。
即使ヶ辆()是使用你必须运用它的“正道”,见http://shiflett.org/blog/2005/dec/google-xss-example