转义AngularJS指令中的HTML文本

edA*_*a-y 27 angularjs

是否有一个角度JS命令将在文本上进行HTML转义?我正在处理一个自定义指令,并需要转义它生成的一些输出.

在内部,AngularJS sanitzer使用encodeEntities函数,但不暴露它.我知道我可以复制这个函数,但似乎应该有一个标准的方法来做到这一点.


用例:我有一个自定义指令,用于语言本地化.该指令使用数据文件中的键查找来查找语言文本.在某些情况下,允许此文本包含HTML,和/或该指令生成HTML以改进最终的可视格式.此外,该指令将Angular表达式作为参数,并将它们用作字符串中标记的替换.我需要对这些参数进行编码,因为它们可能不是HTML安全的.

例如,该指令被称为属性i18n-html='welcome_text_html,1+1,user.name'.该指令然后按照描述格式化字符串并用于element.html更新DOM节点.

mb2*_*b21 26

这个答案是关于逃避,而不是清理 HTML.有两种方法:

  1. 正如@maniekq所提到的,如果您可以使用DOM,请执行以下操作:

    element.text( scope.myValue );
    
    Run Code Online (Sandbox Code Playgroud)
  2. 这个答案中,您可以使用来自mustache.js的代码,例如创建一个角度过滤器:

    angular.module('myModule').filter('escapeHtml', function () {
    
        var entityMap = {
            "&": "&",
            "<": "&lt;",
            ">": "&gt;",
            '"': '&quot;',
            "'": '&#39;',
            "/": '&#x2F;'
        };
    
        return function(str) {
            return String(str).replace(/[&<>"'\/]/g, function (s) {
                return entityMap[s];
            });
        }
    });
    
    Run Code Online (Sandbox Code Playgroud)

  • 斜线是[OWASP推荐](https://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet#RULE_.234_-_CSS_Escape_And_Strictly_Validate_Before_Inserting_Untrusted_Data_into_HTML_Style_Property_Values) (2认同)
  • 但是,如果您想在 ng-bind-html 中使用此过滤器,则必须将返回值包装在 $sce.trustAsHtml() 中。否则,将会引发“Error: $sce:unsafe”。 (2认同)

Jos*_*ler -1

在 AngularJS 中,有两种方法可以进行 HTML 清理。第一个是使用 ngBindHtml 指令,第二个是使用 $sanitize 服务。

function MyCtrl ( $scope, $sanitize ) {
  $scope.rawHtml = "<div><script></script></div>";
  $scope.sanitizedHmtl = $sanitize( $scope.rawHtml );
}
Run Code Online (Sandbox Code Playgroud)

那么这两者在功能上是等价的:

<div ng-bind-html="rawHtml"></div>
<div ng-bind-html-unsafe="sanitizedHtml"></div>
Run Code Online (Sandbox Code Playgroud)

如果在指令中使用,就像您的问题一样,您可以简单地插入经过清理的 HTML:

element.html( scope.sanitizedHtml );
Run Code Online (Sandbox Code Playgroud)

但在大多数情况下,编写指令时,您可以将其放在模板中并使用 ngBindHtml,如上所述。但它适用于极端情况。

  • 消毒与逃避不同。Escpaing 正在执行诸如“&lt;”到“&lt;”之类的转换 (37认同)