Czy ktoś zna prosty sposób na ucieczkę HTML z ciągów znaków w jQuery ? Muszę być w stanie przekazać dowolny ciąg znaków i odpowiednio wstawić znak ucieczki w celu wyświetlenia na stronie HTML (zapobiegając atakom JavaScript / HTML). Jestem pewien, że można rozszerzyć jQuery, aby to zrobić, ale w tej chwili nie wiem wystarczająco dużo o frameworku, aby to osiągnąć.
javascript
jquery
string
escaping
Strona
źródło
źródło
Odpowiedzi:
Ponieważ używasz jQuery , możesz po prostu ustawić właściwość elementu
text
:źródło
$(element2).attr("some-attr", $(element1).html());
Zobacz ten przykład: jsbin.com/atibig/1/editIstnieje również rozwiązanie z mustache.js
źródło
'
jest odwzorowany na byt o formacie dziesiętnym , podczas gdy/
używa formatu szesnastkowego .\n
do<br>
?Źródło: http://debuggable.com/posts/encode-html-entities-with-jquery:480f4dd6-13cc-4ce9-8071-4710cbdd56cb
źródło
attr()
metoda jQuery (od co najmniej 1.8.3) wykonuje własne kodowanie, dzięki czemu niekodowane ciągi mogą być przekazywane bezpośrednio ; np .:$('<div/>').attr('test-attr', '\'Tis "fun" & stuff')[0].outerHTML
$('<div/>')
tworzy nowydiv
element, który nie jest dołączony do DOM. Więc nie zmieni żadnych istniejących elementów. To trochę mylące, w jaki sposób jQuery używa tej samej$()
funkcji zarówno do znajdowania elementów ($('div')
), jak i do ich tworzenia, a także dla kilku innych rzeczy oprócz… :)Jeśli uciekasz w stronę HTML, są tylko trzy, o których myślę, że byłyby naprawdę konieczne:
W zależności od przypadku zastosowania, może być konieczne, aby robić rzeczy, jak
"
się"
. Jeśli lista jest wystarczająco duża, użyłbym tablicy:encodeURIComponent()
uniknie go tylko w przypadku adresów URL, a nie HTML.źródło
var
aby zadeklarowaćitem
lokalnie; tak czy inaczej, nie używajfor … in
pętli w ogóle podczas zapętlania tablicy!for
Zamiast tego użyj zwykłej pętli. Och, i toencodeURIComponent
nie jestescapeURIComponent
.é
; Oto lista jednostek HTML, w celach informacyjnych: w3schools.com/tags/ref_entities.aspŁatwy w użyciu podkreślnik:
Podkreślenie to biblioteka narzędziowa, która zapewnia wiele funkcji, których nie zapewnia natywny js. Istnieje również lodash, który jest tym samym interfejsem API co podkreślenie, ale został przepisany, aby był bardziej wydajny.
źródło
Napisałem małą funkcję, która to robi. To tylko ucieka
"
,&
,<
i>
(ale zwykle to wszystko, czego potrzeba w każdym razie). Jest nieco bardziej elegancki niż wcześniej proponowane rozwiązania, ponieważ używa tylko jednego.replace()
do przeprowadzenia całej konwersji. ( EDYCJA 2: Zmniejszona złożoność kodu sprawia, że funkcja jest jeszcze mniejsza i bardziej uporządkowana, jeśli jesteś ciekawy oryginalnego kodu, zobacz koniec tej odpowiedzi).To jest zwykły Javascript, bez użycia jQuery.
Ucieczki
/
i'
zbytEdytuj w odpowiedzi na komentarz mklement .
Powyższą funkcję można łatwo rozszerzyć o dowolny znak. Aby określić więcej znaków do ucieczki, wystarczy wstawić je zarówno do klasy znaków w wyrażeniu regularnym (tj. Wewnątrz
/[...]/g
), jak i jako wpis wchr
obiekcie. ( EDYCJA 2: ten sam sposób również skróciłem tę funkcję.)Zwróć uwagę na powyższe użycie
'
apostrofu ('
zamiast tego można było użyć bytu symbolicznego - jest on zdefiniowany w XML, ale pierwotnie nie był uwzględniony w specyfikacji HTML i dlatego może nie być obsługiwany przez wszystkie przeglądarki. Zobacz: Artykuł w Wikipedii na temat kodowania znaków HTML ). Pamiętam też, że czytałem gdzieś, że używanie elementów dziesiętnych jest szerzej obsługiwane niż szesnastkowe, ale nie mogę teraz znaleźć źródła tego. (I nie może istnieć wiele przeglądarek, które nie obsługują bytów szesnastkowych.)Uwaga: Dodawanie
/
i'
do listy znaków ucieczki nie jest aż tak przydatne, ponieważ nie mają one specjalnego znaczenia w HTML i nie wymagają ich zmieniać.Oryginalny
escapeHtml
funkcjaEDYCJA 2: Oryginalna funkcja używała zmiennej (
chr
) do przechowywania obiektu potrzebnego do.replace()
wywołania zwrotnego. Ta zmienna wymagała także dodatkowej anonimowej funkcji do jej objęcia zasięgiem, dzięki czemu funkcja (niepotrzebnie) jest nieco większa i bardziej złożona.Nie testowałem, która z dwóch wersji jest szybsza. Jeśli tak, możesz dodać tutaj informacje i linki na ten temat.
źródło
mustache.js
iunderscore.js
to zrobić? A propos tego ostatniego: to tylko rozpoznaje podmioty numerycznych (reprezentującymi'
i/
„), w wielkiej sześciokątną formę kiedy un ucieczki. W ten sposób tekst uciekłmustache.js
- co ciekawie wykorzystuje mieszankę heksów. i formaty dziesiętne - nie będą poprawnie usuwaneunderscore.js
. Zastanawiam się, jak radzą sobie z tym inne popularne biblioteki.'
mają jakąś zastrzeżoną funkcję w XML (a więc XHTML, jak sądzę?), Dlatego XML (ale nie HTML) ma nazwaną jednostkę'
. Nie wiem dokładnie, dlaczego lub w jaki sposób jest „zarezerwowany”. - Ukośniki są wyjątkowe w adresach URL, ale tak naprawdę nie gwarantują one włączenia ich do znaków ucieczki HTML (ponieważ kodowanie adresów URL jest czymś zupełnie innym).'
: poprawne: bezpieczne stosowanie tylko w XHTML ; prosto z ust źródła źródła - podkreśl moje: „(...) czytane przez zgodny procesor HTML , (...) użycie 'lub odwołania do encji niestandardowych mogą nie być obsługiwane (...)” - w praktyce : nowoczesne przeglądarki obsługują to nawet w HTML . Ponownie w przypadku liczb szesnastkowych. (to samo źródło; moje podkreślenie): „X musi być małymi literami w dokumentach XML. […] Hhhh może mieszać wielkie i małe litery, chociaż zwykle jest to duży styl .” Pozostawia nas zastanawianie się, kto zdecydował się zakodować ukośniki; może naprawdę pomieszanie URI i kodowania HTML?/
nie jest potrzebne, ale kodowanie'
nadal wydaje się przydatne do bezpiecznego postępowania w przypadku, gdy zakodowany ciąg jest używany jako wartość atrybutu zawarta w pojedynczych cudzysłowach .Zdaję sobie sprawę, jak późno jestem na tę imprezę, ale mam bardzo łatwe rozwiązanie, które nie wymaga jQuery.
Edycja: To nie unika cytatów. Jedynym przypadkiem, w którym cytaty musiałyby być poprzedzone znakiem ucieczki, jest to, czy treść zostanie wklejona w linii do atrybutu w ciągu HTML. Trudno mi wyobrazić sobie przypadek, w którym zrobienie tego byłoby dobrym projektem.
Edycja 3: Aby znaleźć najszybsze rozwiązanie, sprawdź powyższą odpowiedź od Sarama. Ten jest najkrótszy.
źródło
<
i>
ucieczka od cytatów również nie ma żadnej korzyści, chyba że celem wygenerowanej treści jest przejście do atrybutu.Oto czysta, przejrzysta funkcja JavaScript. Będzie uciec od tekstu takiego jak „kilka <wiele” do „kilku <wiele”.
źródło
Po ostatnich testach mogę polecić najszybsze iw pełni kompatybilne z przeglądarkami natywne rozwiązanie javaScript (DOM):
Jeśli powtórzysz to wiele razy, możesz to zrobić z raz przygotowanymi zmiennymi:
Spójrz na moje końcowe porównanie wydajności ( pytanie stosu ).
źródło
var p = document.createElement('p'); p.textContent = html; return p.innerHTML;
textContent
funkcja jest wyłącznie Chrome 1+ Firefox 2 IE9, Opera 9.64 i Safari 3 (oba opisywane "ewentualnie wcześniej"). W ten sposób złamałoby to roszczenie OP „całkowicie kompatybilne z różnymi przeglądarkami”.p.innerText = html; return p.innerHTML
Wypróbuj Underscore.string lib, działa z jQuery.
wynik:
źródło
_.escape()
narzędzia.Poprawiłem przykład mustache.js dodając
escapeHTML()
metodę do obiektu string.W ten sposób jest dość łatwy w użyciu
"Some <text>, more Text&Text".escapeHTML()
źródło
__entityMap
do zakresu lokalnego funkcji. I wszystko toif (typeof String.prototype.escapeHTML !== 'function'){...}
escape()
iunescape()
są przeznaczone do kodowania / dekodowania ciągów dla adresów URL, a nie HTML.Właściwie używam następującego fragmentu kodu, aby wykonać sztuczkę, która nie wymaga żadnych ram:
źródło
"
s, musisz dodać przynajmniej'
i `` do walki. Są one naprawdę potrzebne tylko dla danych znaczników w elementach HTML. W przypadku samych danych HTML (poza znacznikami) wymagane są tylko pierwsze 3.Jeśli masz plik underscore.js, użyj
_.escape
(bardziej wydajny niż metoda jQuery opublikowana powyżej):źródło
Jeśli wybierasz się na regex, w powyższym przykładzie tghw wystąpił błąd.
źródło
To niezły bezpieczny przykład ...
źródło
Możesz to łatwo zrobić za pomocą waniliowej js.
Po prostu dodaj dokument do węzła tekstowego. Zostanie to usunięte przez przeglądarkę.
źródło
Bez zmiennych globalnych, trochę optymalizacji pamięci. Stosowanie:
wynikiem jest:
źródło
2 proste metody, które NIE wymagają JQUERY ...
Możesz zakodować wszystkie znaki w swoim ciągu w następujący sposób:
Albo po prostu kierować głównych bohaterów martwić
&
, podziały wierszy,<
,>
,"
i'
tak:źródło
Przykład ucieczki zwykłego JavaScript:
źródło
źródło
działa jak marzenie
źródło
Ta odpowiedź zawiera jQuery i normalne metody JS, ale jest najkrótsza bez użycia DOM:
Ciąg znaków ucieczki:
It%27s%20%3E%2020%25%20less%20complicated%20this%20way.
Jeśli ci przeszkadzają spacje, spróbuj:
Ciąg znaków ucieczki:
It%27s %3E 20%25 less complicated this way.
Niestety
escape()
funkcja ta była przestarzała w JavaScript 1.5 .encodeURI()
lubencodeURIComponent()
są alternatywami, ale ignorują'
, więc ostatni wiersz kodu zamieniłby się w to:Wszystkie główne przeglądarki nadal obsługują krótki kod, a biorąc pod uwagę liczbę starych stron internetowych, wątpię, aby wkrótce się to zmieniło.
źródło
ES6 jeden liner do rozwiązania z mustache.js
źródło
Jeśli zapisujesz te informacje w bazie danych , nie można uciec HTML za pomocą skryptu po stronie klienta , należy to zrobić na serwerze . W przeciwnym razie łatwo obejść ochronę XSS.
Aby wyrazić się jasno, oto przykład wykorzystujący jedną z odpowiedzi:
Załóżmy, że używasz funkcji escapeHtml, aby uciec z kodu HTML od komentarza na blogu, a następnie opublikować go na serwerze.
Użytkownik może:
Jeśli użytkownik wklei ten fragment w konsoli, pominie sprawdzanie poprawności XSS:
źródło
Wszystkie rozwiązania są bezużyteczne, jeśli dont zapobiec ponownemu ucieczki, np większość rozwiązań byłoby zachować uciekając
&
się&
.źródło