Javascript 使用正则表达式解析文本以防止XSS
我正在尝试解析Javascript 使用正则表达式解析文本以防止XSS,javascript,regex,xss,Javascript,Regex,Xss,我正在尝试解析html格式的文本块,它只允许粗体和斜体 我知道几乎不可能解析html文本来保护XSS。但是考虑到只有粗体和斜体的限制,使用正则表达式过滤掉不必要的标记是否可行 谢谢 ---编辑--- 我的意思是在客户端进行解析,然后立即返回 在下结论之前,请针对这一点测试您的代码。 顺便说一句,为什么问题本身会被否决 ---封闭的--- 我选择了@Siguza的答案来结束这次讨论 解析出标记,替换为特殊分隔符(或存储索引) 用标记替换分隔符 确保没有任何不匹配的标记 XSS清理需要在服务器端
html
格式的文本块,它只允许粗体
和斜体
我知道几乎不可能解析html文本来保护XSS。但是考虑到只有粗体
和斜体
的限制,使用正则表达式过滤掉不必要的标记是否可行
谢谢
---编辑---
我的意思是在客户端进行解析,然后立即返回
在下结论之前,请针对这一点测试您的代码。
顺便说一句,为什么问题本身会被否决
---封闭的---
我选择了@Siguza的答案来结束这次讨论
解析出标记,替换为特殊分隔符(或存储索引)
用标记替换分隔符
确保没有任何不匹配的标记
XSS清理需要在服务器端完成——客户端控制客户端,可以绕过任何检查
我仍然认为OWASP备忘单对于XSS消毒是足够的,并且仅替换空的粗体和斜体标记不应损害任何规则。您能用regex做到这一点吗?有点您必须编写一个正则表达式来查找所有不是b或i标记的标记。下面是一个简单的例子,它匹配任何包含超过1个字符的标记,它只允许
,
,
,
,
,
,和
(不允许使用空格、属性和类),我相信这符合您的需要。可能有一个更精确的正则表达式,但这很简单。它可能会也可能不会抓住一切。可能没有
<[^>]{2,}[^/]>
]{2,}[^/]>
你应该用正则表达式这样做吗?没有。还有其他更好、更安全的方法。我能想到的最简单、可能也是最安全的方法(使用regex)是首先分别用
和
替换所有
和
,然后显式地“取消替换”b
和I
标记
要替换
,只需文本替换,无需正则表达式。但我相信你知道如何在正则表达式中实现这一点。
要重新启用i
和b
标记,还可以使用四种文本替换:
<b> => <b>
</b> => </b>
<i> => <i>
</i> => </i>
据我所知,问题不在于标签,而在于需要保护的所有其他输入内容。在浏览器上使用JavaScript无法做到这一点。要做到这一点,您必须在服务器端做一些事情;在它有机会访问客户端之前(否则有人可能会注入自定义javascript来删除您的javascript删除)。@GeorgeStocker无论前端如何,后端都应该自己处理输入。话虽如此,我在前端对其进行过滤的原因是,我不想将文本发送回服务器,等待经过净化的数据返回。这会延迟程序,不是一个好的UI体验。我知道我可以使用一个消毒器javascript库,但我发现的库太大,无法在前端加载。这就是我想用正则表达式过滤掉内容的方法。顺便说一句,
@LinDong您不能在客户端执行此操作。它不安全,不会保护用户免受XSS攻击。@LinDong我的意思是,您应该更喜欢服务器端解析而不是客户端解析,也应该更喜欢非正则表达式而不是正则表达式。就像我说的,带有属性的标签会被匹配,所以字面上只有能够通过,才会被匹配。请看我的评论,前端和后端都会处理输入。但是我不想来回发送请求以增加延迟。我更愿意在客户端解析并显示它,然后在ajax调用后替换后端净化文本。@LinDong那么,是什么阻止攻击者使用他们注入的JavaScript来阻止ajax调用触发?我不会提出类似“你应该没事”的建议如果OP没有说明他们是在服务器端还是客户端进行操作。如果他们试图在客户端解析它;他们将无法保护免受XSS攻击。有一整套XSS攻击可以绕过这一点:
<>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 />