我怎么能去更换 string
:
Hello my name is <a href='/max'>max</a>!
<script>alert("DANGEROUS SCRIPT INJECTION");</script>
与
Hello my name is <a href='/max'>max</a>!
<script>alert("DANGEROUS SCRIPT INJECTION");</script>
我可以轻松拥有所有 <
, >
替换为 <
, >
与:
string = string.replace(/</g, "<").replace(/>/g, ">");
但我还是希望能够拥有<a>
链接。
我还研究了如何防止脚本注入(inject):
var html = $(string.bold());
html.find('script').remove();
但我希望仍然能够读取脚本标签而不是将其删除。
最佳答案
解决此问题的一种方法是使用具有严格后视模式的正则表达式,该模式仅允许非常紧密地遵循特定格式的 anchor 。
假设您只想允许完全遵循此示例的链接:
<a href="http://host.domain/path?query#anchor">text</a>
和
<a href="https://host.domain/path?query#anchor">text</a>
构建一个正则表达式,它只匹配没有跟在这个有效模式后面的“<”字符(负向后看):
<(?!a href="https?:\/\/\w[\w.-\/\?#]+">\w+<\/a>)
这个正则表达式的一个问题是,如果您将它与整个字符串进行匹配,<
仍会匹配收盘 a
元素 ( </a>
),因此如果您将每个匹配项替换为 <
毕竟你会打破 anchor 。
您可以允许所有关闭</a>
通过在否定的后视中附加一个替代品来标记:
<(?!a href="https?:\/\/\w[\w.-\/\?#]+">\w+<\/a>|\/a>)
也许其他人对该子问题有更好的解决方案。
这是最后的字符串替换:
string.replace(/<(?!a href="https?:\/\/\w[\w.-\/\?#]+">\w+<\/a>|\/a>)/g, '<');
注意:所有这些输入检查必须始终在服务器端完成,在客户端可以简单地规避检查,尽管进行了检查,您仍会将恶意数据发送到您的服务器。
关于javascript - 用等效的 HTML 替换字符串。除了 <a> 标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35503980/