【发布时间】:2016-05-31 22:45:06
【问题描述】:
我该如何替换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>
我可以轻松地将所有&lt;,&gt; 替换为&lt;,&gt;:
string = string.replace(/</g, "<").replace(/>/g, ">");
但我仍然希望能够拥有<a> 链接。
我还研究了如何防止脚本注入:
var html = $(string.bold());
html.find('script').remove();
但我希望能够仍然读取脚本标签,而不是删除它们。
【问题讨论】:
-
您最好不要在字符串中允许任何 HTML,并具有用于插入链接的预定义格式,类似于 SO 的做法(例如,
[linktext](http://linkurl.com))。这样,您的字符串中就没有 HTML,并且可以完全控制添加的内容。 -
@RajaprabhuAravindasamy 这不是重复的 - 它从字符串中删除 all HTML。 OP 希望保留
a元素(可能还有其他元素) -
您可以使用
var newStr = $('<div>', {html: str}).find(':not(a)').replaceWith(function(){ return this.outerHTML.replace(/</g, "&lt;").replace(/>/g, "&gt;"); }).end().html();,其中str是您的原始字符串。就是说,你当然有更好的事情要做...... -
@Maximilian 因为我认为这是XY problem,我相信你有更好的办法。如果我理解它,您正在尝试在任何用户输入之后清理数据客户端。但是用户仍然可以发送他想要的任何内容。因此,如果您必须清理某些数据,则必须在服务器端完成,而不是在客户端
-
@A.Wolff 的解决方案是不完整的,它将允许诸如
<a href="javascript:alert('evil');">锚点之类的东西以及诸如事件处理程序属性之类的更多问题。
标签: javascript jquery regex code-injection