Estou tentando usar o $sanitize
provedor e a ng-bind-htm-unsafe
diretiva para permitir que meu controlador injete HTML em um DIV.
No entanto, não consigo fazê-lo funcionar.
<div ng-bind-html-unsafe="{{preview_data.preview.embed.html}}"></div>
Eu descobri que é porque foi removido do AngularJS (obrigado).
Mas sem ng-bind-html-unsafe
, eu recebo este erro:
Respostas:
ngSanitize
módulo no seuapp
exemplo:var app = angular.module('myApp', ['ngSanitize']);
ng-bind-html
ohtml
conteúdo original . Não há necessidade de fazer mais nada no seu controlador. A análise e conversão são feitas automaticamente pelangBindHtml
diretiva. (Leia aHow does it work
seção sobre isso: $ sce ). Então, no seu caso<div ng-bind-html="preview_data.preview.embed.html"></div>
, faria o trabalho.fonte
Em vez de declarar uma função no seu escopo, conforme sugerido por Alex, você pode convertê-la em um filtro simples:
Então você pode usá-lo assim:
E aqui está um exemplo de trabalho: http://jsfiddle.net/leeroy/6j4Lg/1/
fonte
<td ng-bind-html="representative.primary | to_trusted"></td>
Você indicou que está usando o Angular 1.2.0 ... como um dos outros comentários indicados,
ng-bind-html-unsafe
foi preterido.Em vez disso, você deve fazer algo assim:
No seu controlador, injete o
$sce
serviço e marque o HTML como "confiável":Observe que você deseja usar o 1.2.0-rc3 ou mais recente. (Eles corrigiram um bug no rc3 que impedia que "observadores" funcionassem corretamente em HTML confiável.)
fonte
myApp.controller('myCtrl', ['$scope', '$sce', function($scope, $sce) {
ngSanitize
abaixo ( stackoverflow.com/a/25679834/22227 ) para uma solução alternativa e mais segura.trustAsHtml
faz o que diz, ele confia em qualquer código de entrada html, o que pode resultar em Scripting (XSS) ataques Cross-SitePara mim, a solução mais simples e flexível é:
E adicione função ao seu controlador:
Não se esqueça de adicionar
$sce
à inicialização do seu controlador.fonte
A melhor solução para isso, na minha opinião, é esta:
Crie um filtro personalizado que possa estar em um arquivo common.module.js, por exemplo - usado em seu aplicativo:
Uso:
Agora - não vejo por que a diretiva
ng-bind-html
não faztrustAsHtml
parte de sua função - me parece um pouco tolo que nãoEnfim - é assim que eu faço - 67% das vezes, funciona sempre.
fonte
Você pode criar sua própria ligação html insegura simples, é claro, se você usar a entrada do usuário, isso pode ser um risco à segurança.
fonte
$sce.trustAsHtml
?Você não precisa usar {{}} dentro do ng-bind-html-unsafe:
Aqui está um exemplo: http://plnkr.co/edit/R7JmGIo4xcJoBc1v4iki?p=preview
O operador {{}} é essencialmente apenas uma abreviação para ng-bind, então o que você estava tentando equivale a uma ligação dentro de uma ligação, o que não funciona.
fonte
{{}}
operador estava causando meu problema com a ligação falha, obrigado pela dica!Eu tive um problema semelhante. Ainda não foi possível obter o conteúdo dos meus arquivos de remarcação hospedados no github.
Depois de configurar uma lista de permissões (com o domínio github adicionado) no $ sceDelegateProvider no app.js, funcionou como um encanto.
Descrição: use uma lista de permissões em vez de agrupar como confiável se você carregar conteúdo de URLs diferentes.
Docs: $ sceDelegateProvider e ngInclude (para buscar, compilar e incluir fragmento HTML externo)
fonte
O escape contextual estrito pode ser totalmente desativado, permitindo que você injete html usando
ng-html-bind
. Essa é uma opção insegura, mas útil ao testar.Exemplo da documentação
$sce
do AngularJS sobre :Anexar a seção de configuração acima ao seu aplicativo permitirá que você injete html
ng-html-bind
, mas como o documento observa:fonte
Você pode usar filtro como este
uso
pode ser usado para outros tipos de recursos, por exemplo, link de origem para iframes e outros tipos declarados aqui
fonte