相关疑难解决方法(0)

使用jQuery转义HTML字符串

有没有人知道在jQuery中从字符串中转义HTML的简单方法?我需要能够传递任意字符串并将其正确转义以便在HTML页面中显示(防止JavaScript/HTML注入攻击).我确信可以扩展jQuery来实现这一点,但我目前还不了解框架来完成这个任务.

javascript string jquery escaping

593
推荐指数
15
解决办法
64万
查看次数

在javascript中编码html实体

我在CMS中工作,允许用户输入内容.问题是,当他们添加符号时®,它可能无法在所有浏览器中良好显示.我想设置一个必须搜索的符号列表,然后转换为相应的html实体.例如

®=> ®
&=> &
©=> ©
™=>™

转换后,需要将其包装在<sup>标记中,从而产生以下结果:

® => <sup>&reg;</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)

"[?]"表示有些东西我不确定.

额外细节:

  • 我想用纯JavaScript做到这一点,而不是需要像jQuery这样的库,谢谢.
  • 后端是Ruby
  • 使用使用Ruby on Rails构建的RefineryCMS

html javascript

68
推荐指数
10
解决办法
16万
查看次数

正则表达式不匹配部分序列,但匹配完整序列

我有一些像这样的转义HTML:

&lt;img border=&#039;0&#039; /&gt;
Run Code Online (Sandbox Code Playgroud)

我正在尝试匹配和替换完整的转义序列,&#039;但不是部分的,比如39,因为39实际上并不是未转义的字符串.实质上,每个转义序列应该被视为一个令牌.

这是一个JS正则表达式.有没有一种方法来排除之间的匹配&,并;同时还接受包括这两个字符序列?

期望的结果:

  • 搜索&lt;img border=&#039;0&#039; /&gt;lt:不匹配.
  • 搜索&lt;img border=&#039;0&#039; /&gt;39:不匹配.
  • 搜索&lt;img border=&#039;0&#039; /&gt;&#039;:匹配.
  • 搜索&lt;img border=&#039;0&#039; /&gt;border=&#039;:匹配.

当前代码:

> var str = '&lt;img border=&#039;0&#039; /&gt;'
> str.replace(/(border)/gi, '|$1|')
'&lt;img |border|=&#039;0&#039; /&gt;'  // ok
> str.replace(/(39)/gi, '|$1|')
'&lt;img border=&#0|39|;0&#0|39|; /&gt;'  // not ok
Run Code Online (Sandbox Code Playgroud)

注意:我不能无意中重新逃脱以匹配.它必须逃脱.

javascript regex

14
推荐指数
1
解决办法
1286
查看次数

Mustache.js只允许换行,转义其他HTML

我正在用户输入创建注释,并在用户单击"提交"后使用Mustache.js呈现它们.我意识到我可以替换用户输入换行符(\n)<br/>以呈现为HTML中断,例如

myString.replace(/\n/g, '<br />');

我意识到我可以通过使用三个括号使Mustache不能逃脱HTML

{{{myString}}}

但是,我想要逃避所有用户HTML,因为Mustache通常会使用双括号{{ ... }},但允许换行符除外<br/>

做这个的最好方式是什么?我可以在渲染后替换换行符,但这似乎是一个非常低效的解决方案,而且我认为必须有更好的方法.

javascript mustache

8
推荐指数
1
解决办法
6047
查看次数

Angular.js中的部分HTML字符串转义

我看了一下逃逸角的方式默认一切$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实体?)?这种事情是否有首选做法?

javascript security angularjs angular-translate

5
推荐指数
1
解决办法
4130
查看次数

getAttribute("name")unescapes html?

我们有一些自定义的JS脚本来处理工具提示,它们在我们渲染页面时放在dom属性(工具提示)中.

但是当我尝试检索此工具提示(显示为div)时,字符串javaScript似乎会自动取消属性值.这是正常的行为吗?有没有办法避免这种情况?

我遇到的问题是<email@example.org>变成(无效)html.

复制的例子:

<div tltip ="&lt;text&gt;" 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> &lt;email@example.com&gt <\b>" 从dom并显示在div应该看起来像:" <email@example.org> "

html javascript dom

4
推荐指数
1
解决办法
3280
查看次数