javascript - 用等效的 HTML 替换字符串。除了 <a> 标签

标签 javascript jquery regex code-injection

我怎么能去更换 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>! 
&lt;script&gt;alert("DANGEROUS SCRIPT INJECTION");&lt;/script&gt;

我可以轻松拥有所有 < , >替换为 &lt; , &gt;与:

string = string.replace(/</g, "&lt;").replace(/>/g, "&gt;");

但我还是希望能够拥有<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> ),因此如果您将每个匹配项替换为 &lt;毕竟你会打破 anchor 。

您可以允许所有关闭</a>通过在否定的后视中附加一个替代品来标记:

<(?!a href="https?:\/\/\w[\w.-\/\?#]+">\w+<\/a>|\/a>)

也许其他人对该子问题有更好的解决方案。

这是最后的字符串替换:

string.replace(/<(?!a href="https?:\/\/\w[\w.-\/\?#]+">\w+<\/a>|\/a>)/g, '&lt;');

注意:所有这些输入检查必须始终在服务器端完成,在客户端可以简单地规避检查,尽管进行了检查,您仍会将恶意数据发送到您的服务器。

关于javascript - 用等效的 HTML 替换字符串。除了 <a> 标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35503980/

相关文章:

javascript - 有没有一种方法可以在对象内动态添加新属性,同时也动态添加新属性?

javascript - Bootstrap 日期时间选择器日历未打开 Angular 2

jquery - 使用 Asp.net mvc 和 jQuery load() 将变量传递到 View

regex - Sqlite3 FTS : Limiting length of items between two words in match request?

ruby - 我想使用 ruby​​ gsub 将参数附加到 url

javascript - Google Maps API v3 隐藏和显示绑定(bind)到标记的圆圈

JavaScript Window.Open 位置功能不起作用

javascript - 正则表达式忽略特殊字符

javascript - 如何将对 d3 元素的引用传递给函数?

php - 如何使用 phonegap 发送推送通知并解析