Próbuję użyć $sanitize
dostawcy i ng-bind-htm-unsafe
dyrektywy, aby umożliwić mojemu kontrolerowi wstrzykiwanie HTML do DIV.
Nie mogę go jednak uruchomić.
<div ng-bind-html-unsafe="{{preview_data.preview.embed.html}}"></div>
Odkryłem, że dzieje się tak, ponieważ został usunięty z AngularJS (dzięki).
Ale bez ng-bind-html-unsafe
tego pojawia się ten błąd:
Odpowiedzi:
ngSanitize
moduł naapp
np .:var app = angular.module('myApp', ['ngSanitize']);
ng-bind-html
oryginalnąhtml
treścią. Nie musisz nic więcej robić w kontrolerze. Analiza i konwersja są wykonywane automatycznie przezngBindHtml
dyrektywę. (PrzeczytajHow does it work
sekcję na ten temat: $ sce ). Więc w twoim przypadku<div ng-bind-html="preview_data.preview.embed.html"></div>
wykona pracę.źródło
Zamiast deklarować funkcję w swoim zakresie, jak sugeruje Alex, możesz przekonwertować ją na prosty filtr:
Następnie możesz użyć tego w następujący sposób:
A oto działający przykład: http://jsfiddle.net/leeroy/6j4Lg/1/
źródło
<td ng-bind-html="representative.primary | to_trusted"></td>
Wskazałeś, że używasz Angulara 1.2.0 ... ponieważ jeden z pozostałych wskazanych komentarzy
ng-bind-html-unsafe
został wycofany.Zamiast tego będziesz chciał zrobić coś takiego:
Wstrzyknij
$sce
usługę do kontrolera i oznacz HTML jako „zaufany”:Pamiętaj, że będziesz chciał używać wersji 1.2.0-rc3 lub nowszej. (Naprawiono błąd w rc3, który uniemożliwiał „obserwatorom” poprawne działanie na zaufanym HTML.)
źródło
myApp.controller('myCtrl', ['$scope', '$sce', function($scope, $sce) {
ngSanitize
poniżej ( stackoverflow.com/a/25679834/22227 ), aby uzyskać alternatywną, bezpieczniejszą poprawkę.trustAsHtml
robi to, co mówi, ufa wszelkiemu przychodzącemu kodowi HTML, który może prowadzić do ataków XSS (Cross-Site Scripting)Dla mnie najprostszym i najbardziej elastycznym rozwiązaniem jest:
I dodaj funkcję do kontrolera:
Nie zapomnij dodać
$sce
do inicjalizacji kontrolera.źródło
Moim zdaniem najlepszym rozwiązaniem tego jest:
Utwórz niestandardowy filtr, który może znajdować się na przykład w pliku common.module.js - używany w Twojej aplikacji:
Stosowanie:
Teraz - nie rozumiem, dlaczego dyrektywa
ng-bind-html
tego nie robitrustAsHtml
wchodzi w skład jej funkcji - wydaje mi się trochę głupia, że tak nie jestW każdym razie - w ten sposób to robię - 67% czasu, to działa zawsze.
źródło
Możesz utworzyć własne proste niebezpieczne wiązanie HTML, oczywiście jeśli użyjesz danych wprowadzonych przez użytkownika, może to stanowić zagrożenie bezpieczeństwa.
źródło
$sce.trustAsHtml
?Nie musisz używać {{}} w ng-bind-html-unsafe:
Oto przykład: http://plnkr.co/edit/R7JmGIo4xcJoBc1v4iki?p=preview
Operator {{}} jest w zasadzie tylko skrótem dla ng-bind, więc to, czego próbujesz, sprowadza się do wiązania wewnątrz wiązania, które nie działa.
źródło
{{}}
Operator był przyczyną mojego problemu z wiązaniem upadających, dzięki za podpowiedź!Miałem podobny problem. Nadal nie mogłem pobrać treści z moich plików obniżki cen przechowywanych na github.
Po skonfigurowaniu białej listy (z dodaną domeną github) w $ sceDelegateProvider w app.js działało to jak urok.
Opis: używanie białej listy zamiast pakowania jako zaufanego, jeśli ładujesz zawartość z innych adresów URL.
Dokumenty: $ sceDelegateProvider i ngInclude (do pobierania, kompilowania i dołączania zewnętrznego fragmentu HTML)
źródło
Ścisłe przeskakiwanie kontekstowe można całkowicie wyłączyć, umożliwiając wstrzykiwanie html przy użyciu
ng-html-bind
. Jest to niebezpieczna opcja, ale pomocna podczas testowania.Przykład z dokumentacji AngularJS na temat
$sce
:Dołączenie powyższej sekcji konfiguracji do aplikacji pozwoli ci wstrzyknąć HTML do
ng-html-bind
, ale jak zauważa dokument:źródło
Możesz użyć takiego filtra
stosowanie
może być użyty do innych typów zasobów, na przykład link źródłowy dla ramek iframe i innych typów zadeklarowanych tutaj
źródło