使用正则表达式解析文本以防止XSS

时间:2015-04-13 18:34:12

标签: javascript regex xss

我正在尝试以html格式解析一小段文字,只允许bold <b></b>italic <i></i>

我知道解析html文本几乎不可能保护XSS。但考虑到仅bolditalic的约束,使用正则表达式过滤掉不必要的标签是否可行?

感谢。

---编辑---

我打算在客户端进行解析,然后将其渲染回来。

在开始讨论之前,请先针对此测试您的代码。 http://voog.github.io/wysihtml/examples/simple.html

顺便说一下,为什么问题本身会被投票?

---关闭---

我选择@Siguza的答案来结束讨论。

3 个答案:

答案 0 :(得分:0)

你能用正则表达式做到这一点吗?的种类。你必须编写一个正则表达式来查找不是b或i标签的所有标签。下面是一个简单示例,它匹配任何包含多个字符的标记,只允许<a><b><i><p>,{{1 }},<q><s>(没有空格,没有属性,也没有允许的类),我相信这符合您的需求。可能有一个更精确的正则表达式,但这很简单。它可能会也可能不会捕获一切。它可能没有。

<u>

你应该用正则表达式吗?不。还有其他更好,更安全的方式。

答案 1 :(得分:0)

我能想到的最简单且可能最安全的方法(使用正则表达式执行此操作)是首先分别用<>替换所有&lt;&gt;,然后明确“取消替换”bi代码。

要替换<>,您只需要文本替换,而不是正则表达式。但我相信你知道如何在正则表达式中做到这一点 要重新启用ib标记,您还可以使用四个文本替换:

&lt;b&gt; => <b>
&lt;/b&gt; => </b>
&lt;i&gt; => <i>
&lt;/i&gt; => </i>

或者,在正则表达式中将/&lt;(\/?[bi])&gt;/g替换为<$1>

但是...

...为了完整起见,只需一次正则表达式替换就可以实现

/<(|\/|[^>\/bi]|\/[^>bi]|[^\/>][^>]+|\/[^>][^>]+)>/g替换为&lt;$1&gt;

我不保证这是防弹,但是我使用RegExr对照下面的块进行了测试,它似乎在阻碍:

<>Test</>
<i>Test</i>
<iii>Test</iii>
<b>Test</b>
<bbb>Test</bbb>
<a>Test</a>
<abc>Test</abc>
<some tag with="attributes">Test</some>
<br/>
<br />

答案 2 :(得分:-2)

  1. 解析标签,替换为特殊的分隔符(或商店索引)。
  2. XSS sanitize the input.
  3. 用标签替换分隔符。
  4. 确保您没有任何不匹配的标签。
  5. XSS清理需要在服务器端完成 - 客户端控制客户端,并且可以绕过那里的任何检查。

    我仍然认为OWASP备忘单足以进行XSS清理,并且只替换 空粗体和斜体标签不应该破坏任何规则。