Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/416.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用正则表达式解析文本以防止XSS_Javascript_Regex_Xss - Fatal编程技术网

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
    标记,还可以使用四种文本替换:

    &lt;b&gt; => <b>
    &lt;/b&gt; => </b>
    &lt;i&gt; => <i>
    &lt;/i&gt; => </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 />