Estoy tratando de usar el $sanitize
proveedor y elng-bind-htm-unsafe
directiva para permitir que mi controlador inyecte HTML en un DIV.
Sin embargo, no puedo hacer que funcione.
<div ng-bind-html-unsafe="{{preview_data.preview.embed.html}}"></div>
Descubrí que es porque fue eliminado de AngularJS (gracias).
Pero sin ng-bind-html-unsafe
, me sale este error:
Respuestas:
ngSanitize
módulo en tuapp
p. ej .:var app = angular.module('myApp', ['ngSanitize']);
ng-bind-html
alhtml
contenido original . No es necesario hacer nada más en su controlador. El análisis y la conversión se realizan automáticamente por langBindHtml
directiva. (Lea laHow does it work
sección sobre esto: $ sce ). Entonces, en su caso<div ng-bind-html="preview_data.preview.embed.html"></div>
haría el trabajo.fuente
En lugar de declarar una función en su alcance, como lo sugiere Alex, puede convertirla en un filtro simple:
Entonces puedes usarlo así:
Y aquí hay un ejemplo de trabajo: http://jsfiddle.net/leeroy/6j4Lg/1/
fuente
<td ng-bind-html="representative.primary | to_trusted"></td>
Indicaste que estás usando Angular 1.2.0 ... como uno de los otros comentarios indicados,
ng-bind-html-unsafe
ha quedado en desuso.En cambio, querrás hacer algo como esto:
En su controlador, inyecte el
$sce
servicio y marque el HTML como "confiable":Tenga en cuenta que querrá usar 1.2.0-rc3 o más reciente. ( Arreglaron un error en rc3 que impedía que los "observadores" funcionaran correctamente en HTML de confianza).
fuente
myApp.controller('myCtrl', ['$scope', '$sce', function($scope, $sce) {
ngSanitize
continuación ( stackoverflow.com/a/25679834/22227 ) para obtener una solución alternativa más segura.trustAsHtml
hace lo que dice, confía en cualquier código html entrante, lo que puede resultar en ataques de Cross-Site Scripting (XSS)Para mí, la solución más simple y flexible es:
Y agregue la función a su controlador:
No olvide agregar
$sce
a la inicialización de su controlador.fuente
La mejor solución para esto en mi opinión es esta:
Cree un filtro personalizado que pueda estar en un archivo common.module.js, por ejemplo, utilizado en toda su aplicación:
Uso:
Ahora, no veo por qué la directiva
ng-bind-html
notrustAsHtml
forma parte de su función, me parece un poco tonto que noDe todos modos, así es como lo hago, el 67% de las veces funciona siempre.
fuente
Puede crear su propio enlace html inseguro simple, por supuesto, si utiliza la entrada del usuario, podría ser un riesgo de seguridad.
fuente
$sce.trustAsHtml
?No necesita usar {{}} dentro de ng-bind-html-inseguro:
Aquí hay un ejemplo: http://plnkr.co/edit/R7JmGIo4xcJoBc1v4iki?p=preview
El operador {{}} es esencialmente una abreviatura de ng-bind, por lo que lo que estaba intentando equivale a un enlace dentro de un enlace, que no funciona.
fuente
{{}}
operador estaba causando mi problema con el error de enlace, ¡gracias por la pista!He tenido un problema similar Todavía no pude obtener contenido de mis archivos de descuento alojados en github.
Después de configurar una lista blanca (con dominio github agregado) al $ sceDelegateProvider en app.js, funcionó de maravilla.
Descripción: uso de una lista blanca en lugar de ajustar como confiable si carga contenido de diferentes URL.
Documentos: $ sceDelegateProvider y ngInclude (para buscar, compilar e incluir fragmentos HTML externos)
fuente
Escape contextual estricto se puede deshabilitar por completo, lo que le permite inyectar html usando
ng-html-bind
. Esta es una opción insegura, pero útil cuando se realizan pruebas.Ejemplo de la documentación de AngularJS sobre
$sce
:Adjuntar la sección de configuración anterior a su aplicación le permitirá inyectar html
ng-html-bind
, pero como señala el documento:fuente
Puedes usar filtros como este
uso
se puede usar para otros tipos de recursos, por ejemplo, el enlace de origen para iframes y otros tipos declarados aquí
fuente