有没有人知道在jQuery中从字符串中转义HTML的简单方法?我需要能够传递任意字符串并将其正确转义以便在HTML页面中显示(防止JavaScript/HTML注入攻击).我确信可以扩展jQuery来实现这一点,但我目前还不了解框架来完成这个任务.
我在CMS中工作,允许用户输入内容.问题是,当他们添加符号时®,它可能无法在所有浏览器中良好显示.我想设置一个必须搜索的符号列表,然后转换为相应的html实体.例如
®=> ®
&=> &
©=> ©
™=>™
转换后,需要将其包装在<sup>标记中,从而产生以下结果:
® => <sup>®</sup>
因为特定的字体大小和填充样式是必要的:
sup { font-size: 0.6em; padding-top: 0.2em; }
JavaScript会是这样的吗?
var regs = document.querySelectorAll('®');
for ( var i = 0, l = imgs.length; i < l; ++i ) {
var [?] = regs[i];
var [?] = document.createElement('sup');
img.parentNode.insertBefore([?]);
div.appendChild([?]);
}
Run Code Online (Sandbox Code Playgroud)
"[?]"表示有些东西我不确定.
额外细节:
我有一些像这样的转义HTML:
<img border='0' />
Run Code Online (Sandbox Code Playgroud)
我正在尝试匹配和替换完整的转义序列,'但不是部分的,比如39,因为39实际上并不是未转义的字符串.实质上,每个转义序列应该被视为一个令牌.
这是一个JS正则表达式.有没有一种方法来排除之间的匹配&,并;同时还接受包括这两个字符序列?
期望的结果:
<img border='0' />为lt:不匹配.<img border='0' />为39:不匹配.<img border='0' />为':匹配.<img border='0' />为border=':匹配.当前代码:
> var str = '<img border='0' />'
> str.replace(/(border)/gi, '|$1|')
'<img |border|='0' />' // ok
> str.replace(/(39)/gi, '|$1|')
'<img border=�|39|;0�|39|; />' // not ok
Run Code Online (Sandbox Code Playgroud)
注意:我不能无意中重新逃脱以匹配.它必须逃脱.
我正在用户输入创建注释,并在用户单击"提交"后使用Mustache.js呈现它们.我意识到我可以替换用户输入换行符(\n)<br/>以呈现为HTML中断,例如
myString.replace(/\n/g, '<br />');
我意识到我可以通过使用三个括号使Mustache不能逃脱HTML
{{{myString}}}
但是,我想要逃避所有用户HTML,因为Mustache通常会使用双括号{{ ... }},但允许换行符除外<br/>
做这个的最好方式是什么?我可以在渲染后替换换行符,但这似乎是一个非常低效的解决方案,而且我认为必须有更好的方法.
我看了一下逃逸角的方式默认一切和$sce,所以我白名单的数据与$sce.trustAsHtml()通过过滤器(因为$sce没有在服务工作),就像这样:
<sup class="ng-binding" ng-bind-html="row|logEntry"></sup>
Run Code Online (Sandbox Code Playgroud)
但问题是,我不相信HTML的某些部分.
深入研究细节 - 我的翻译中包含HTML,但它们中包含可替换的标记/变量.所以翻译支持HTML,但我不希望提供的令牌包含HTML.
我的过滤器logEntry内部看起来像这样:
var translated = $translate('Log.' + msg.context.entity_type) + '.' + msg.context.action, {
'object_name': msg.context.object_name,
'user': msg.context.user_name
});
return $sce.trustAsHtml(translated);
Run Code Online (Sandbox Code Playgroud)
例如,我可以翻译有关userX更改文章的内容,但如果用户名称包含,我不希望结果文本触发alert() <script>alert('evilname')</script>
$translate它本身是不相关的,它可以是任何HTML字符串,我希望某些部分被常规JS替换.replace(),内容保持"作为文本".
所以我的问题是 - 如何逃避HTML的部分内容?我是否必须在视图内部分切片?或者我是否必须采用自定义转义( 最快的方法将HTML标记转义为HTML实体?)?这种事情是否有首选做法?
我们有一些自定义的JS脚本来处理工具提示,它们在我们渲染页面时放在dom属性(工具提示)中.
但是当我尝试检索此工具提示(显示为div)时,字符串javaScript似乎会自动取消属性值.这是正常的行为吗?有没有办法避免这种情况?
我遇到的问题是<email@example.org>变成(无效)html.
复制的例子:
<div tltip ="<text>" id="escaped" />
<div tltip ="<text>"id="notescaped" />
Run Code Online (Sandbox Code Playgroud)
JS:
a = document.getElementById("escaped").getAttribute("tooltip");
b = document.getElementById("notescaped").getAttribute("tooltip");
a.match("<"); //returns true (unexpected)
a.match("<"); //returns true (expected)
a == b; // returns true (unexpected)
Run Code Online (Sandbox Code Playgroud)
编辑:
澄清我试图显示一个(div)工具提示,我想以某种方式阅读内容,如:
"<b> <email@example.com> <\b>" 从dom并显示在div应该看起来像:" <email@example.org> "