我正在尝试以html
格式解析一小段文字,只允许bold
<b></b>
和italic
<i></i>
。
我知道解析html文本几乎不可能保护XSS。但考虑到仅bold
和italic
的约束,使用正则表达式过滤掉不必要的标签是否可行?
感谢。
---编辑---
我打算在客户端进行解析,然后将其渲染回来。
在开始讨论之前,请先针对此测试您的代码。 http://voog.github.io/wysihtml/examples/simple.html
顺便说一下,为什么问题本身会被投票?---关闭---
我选择@Siguza的答案来结束讨论。
答案 0 :(得分:0)
你能用正则表达式做到这一点吗?的种类。你必须编写一个正则表达式来查找不是b或i标签的所有标签。下面是一个简单示例,它匹配任何包含多个字符的标记,只允许<a>
,<b>
,<i>
,<p>
,{{1 }},<q>
和<s>
(没有空格,没有属性,也没有允许的类),我相信这符合您的需求。可能有一个更精确的正则表达式,但这很简单。它可能会也可能不会捕获一切。它可能没有。
<u>
你应该用正则表达式吗?不。还有其他更好,更安全的方式。
答案 1 :(得分:0)
我能想到的最简单且可能最安全的方法(使用正则表达式执行此操作)是首先分别用<
和>
替换所有<
和>
,然后明确“取消替换”b
和i
代码。
要替换<
和>
,您只需要文本替换,而不是正则表达式。但我相信你知道如何在正则表达式中做到这一点
要重新启用i
和b
标记,您还可以使用四个文本替换:
<b> => <b>
</b> => </b>
<i> => <i>
</i> => </i>
或者,在正则表达式中将/<(\/?[bi])>/g
替换为<$1>
。
...为了完整起见,只需一次正则表达式替换就可以实现 :
将/<(|\/|[^>\/bi]|\/[^>bi]|[^\/>][^>]+|\/[^>][^>]+)>/g
替换为<$1>
。
我不保证这是防弹,但是我使用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)
XSS清理需要在服务器端完成 - 客户端控制客户端,并且可以绕过那里的任何检查。
我仍然认为OWASP备忘单足以进行XSS清理,并且只替换 空粗体和斜体标签不应该破坏任何规则。