2

我已经阅读了 OWASP 的 XSS预防备忘单,但我并没有真正认识到我的应用程序有这些规则。我不觉得我有这些规则中指出的任何漏洞。

我正在做一个遵循以下所有原则的 PHP 应用程序:

  1. 没有一个用户输入直接显示在 HTML 页面上,而无需在服务器端进行处理和清理

  2. 我所有的用户输入都用htmlentities(). 这足够了吗?(我使用准备好的语句进行 SQL 注入)

  3. 一些用户输入maxlength在服务器端具有 5 个字符的条件。这是否有助于防止 XSS?(因为我几乎看不到 XSS 代码短于 6 个字符)

  4. 除了来自数据库的数据之外,唯一显示给用户的用户输入是通过 ajax 发送到服务器的,使用而不是(使用 jQuery)进行清理htmlentities并重新引入 DOMtext()html()

在我的情况下,我应该担心 XSS 吗?我还能做些什么来保护自己免受 XSS 攻击?

4

2 回答 2

1

我所有的用户输入都使用 htmlentities() 进行了清理。这足够了吗?(我使用准备好的语句进行 SQL 注入)

没有。首先,您应该过滤输出,而不是输入。在编程中永远不要相信任何数据,即使是那些来自你自己数据库的数据!在输入时,您只需将其转义以用于 SQL、日志等。但您还必须过滤基本的 html + 一些特殊字符:\0 & < > ( ) + - = " ' \输出。htmlentities() 是不够的。

假设您在网站上有一张图片:

<img src="xxx" onload="image_loaded({some_text_from_db});">

{some_text_from_db}将会);alert(String.fromCharCode(58,53,53)

如果您仅使用 htmlentities 对其进行转义,它将变为:

<img src="" onload="image_loaded( );alert(String.fromCharCode(58,53,53) );">

一些用户输入在服务器端具有 5 个字符的最大长度条件。这是否有助于防止 XSS?(因为我几乎看不到 XSS 代码短于 6 个字符)

总是在服务器端检查数据,如果你也想在客户端,没关系,但总是在服务器端也这样做。许多现代浏览器(chrome、ff、opera)允许用户“即时”编辑页面,以便他们可以轻松删除 maxlength 属性。

除了来自数据库的数据,唯一显示给用户的用户输入是通过 ajax 发送到服务器的,使用 htmlentities 进行清理,并使用 text() 而不是 html()(使用 jQuery)在 DOM 中重新引入

来自 .text() jquery 文档:

我们需要注意,此方法会根据需要对提供的字符串进行转义,以便在 HTML 中正确呈现。为此,它调用 DOM 方法 .createTextNode(),该方法将特殊字符替换为其 HTML 实体等效项(例如 < 表示 <)。

所以可能是的,应该足够了,但要注意从 text() 中转义,就像上面的例子一样。

您的应用程序过滤应如下所示:

  • 输入用户 -> 过滤器 -> 应用程序
  • 输出应用 -> 过滤器 -> 用户

不仅仅是输入过滤。

于 2013-01-03T13:10:52.693 回答
0

我建议将HTMLawedHTMLPurifier用于需要显示为 HTML 的用户输入,或者只是从用户输入中完全剥离不应该包含它的所有 HTML。HTMLPurifier 是两者中更强大的一个,在我使用它的任何项目中,我从未遇到过任何 XSS 问题。

于 2012-06-27T15:23:08.093 回答