Używam JavaScript, aby wyciągnąć wartość z ukrytego pola i wyświetlić ją w polu tekstowym. Wartość w ukrytym polu jest zakodowana.
Na przykład,
<input id='hiddenId' type='hidden' value='chalk & cheese' />
zostaje wciągnięty
<input type='text' value='chalk & cheese' />
za pomocą jQuery, aby uzyskać wartość z ukrytego pola (w tym momencie tracę kodowanie):
$('#hiddenId').attr('value')
Problem polega na tym, że kiedy czytam chalk & cheese
z ukrytego pola, JavaScript traci kodowanie. Nie chcę, żeby ta wartość była chalk & cheese
. Chcę amp;
zachować dosłowność .
Czy istnieje biblioteka JavaScript lub metoda jQuery, która koduje HTML w ciągu?
chalk
i byłcheese
zawsze używany razem 0_oOdpowiedzi:
EDYCJA: Ta odpowiedź została opublikowana dawno temu, a
htmlDecode
funkcja wprowadziła lukę w zabezpieczeniach XSS. Został zmodyfikowany, zmieniając element tymczasowy z adiv
natextarea
zmniejszający szansę XSS. Ale obecnie zachęcam do korzystania z interfejsu API DOMParser, jak sugerowano w innym odpowiedzi .Korzystam z tych funkcji:
Zasadniczo element textarea jest tworzony w pamięci, ale nigdy nie jest dołączany do dokumentu.
W
htmlEncode
funkcji ustawiaminnerText
element i odzyskuję zakodowanyinnerHTML
; whtmlDecode
funkcji ustawiaminnerHTML
wartość elementu iinnerText
jest on pobierany.Sprawdź działający przykład tutaj .
źródło
white-space
właściwość, która sugeruje, jak należy przetwarzać spacje w treści HTML. Obecność własności sugeruje, że „jest to wstępnie sformatowane, należy zachować spacje i łamanie linii”. To łamie separację stylu i treści, ponieważ jeśli spróbujesz sformatować HTML tak, aby był „ładny” lub przejdziesz go przez cykl kodowania / dekodowania w ten sposób, wówczas spacje / przerwy są zmniejszane, a koder nie ma sposób na sprawdzenie, czy było to w porządku, ponieważ nie jest on świadomywhite-space:pre-*;
wskaźnika w zewnętrznym pliku CSS!Sztuczka jQuery nie koduje znaków cudzysłowu, a w IE usuwa białe znaki.
W oparciu o szablon ucieczki w Django, który, jak sądzę, jest już mocno używany / przetestowany, stworzyłem tę funkcję, która robi to, co jest potrzebne.
Jest to prawdopodobnie prostsze (i być może szybsze) niż jakiekolwiek obejście problemu usuwania spacji - i koduje znaki cudzysłowu, co jest niezbędne, jeśli na przykład chcesz użyć wyniku wewnątrz wartości atrybutu.
Aktualizacja 17.06.2013:
W poszukiwaniu najszybszego ucieczki znalazłem tę implementację
replaceAll
metody:http://dumpsite.com/forum/index.php?topic=4.msg29#msg29
(również tutaj: Najszybszy metoda zamiany wszystkich wystąpień znaku w ciągu )
Niektóre wyniki wydajności tutaj:
http://jsperf.com/htmlencoderegex/25
Daje identyczny ciąg wyników do wbudowanych
replace
łańcuchów powyżej. Byłbym bardzo szczęśliwy, gdyby ktoś mógł wyjaśnić, dlaczego jest to szybsze !?Aktualizacja 2015-03-04:
Właśnie zauważyłem, że AngularJS używa dokładnie powyższej metody:
https://github.com/angular/angular.js/blob/v1.3.14/src/ngSanitize/sanitize.js#L435
Dodają kilka udoskonaleń - wydają się radzić sobie z niejasnym problemem związanym z Unicode, a także konwertować wszystkie znaki niealfanumeryczne na jednostki. Miałem wrażenie, że ten ostatni nie był konieczny, dopóki masz zestaw znaków UTF8 określony dla twojego dokumentu.
Zauważę, że (4 lata później) Django nadal nie robi żadnej z tych rzeczy, więc nie jestem pewien, jak ważne są:
https://github.com/django/django/blob/1.8b1/django/utils /html.py#L44
Aktualizacja 2016-04-06:
Możesz także chcieć uciec przed ukośnikiem
/
. Nie jest to wymagane do poprawnego kodowania HTML, jednak jest zalecane przez OWASP jako środek bezpieczeństwa anty-XSS. (dzięki @JNF za sugestie w komentarzach)źródło
'
zamiast'
'
to nie jest poprawna jednostka HTML./g
,.replace()
zastąpi tylko pierwszy mecz.Oto wersja nie-jQuery, która jest znacznie szybsza niż zarówno
.html()
wersja jQuery, jak i.replace()
wersja. Pozwala to zachować wszystkie białe znaki, ale podobnie jak wersja jQuery, nie obsługuje cudzysłowów.Prędkość: http://jsperf.com/htmlencoderegex/17
Próbny:
Wynik:
Scenariusz:
HTML:
źródło
.replace()
wersja niedawno sugerował @SEoF okazuje się znacznie szybciej: jsperf.com/htmlencoderegex/22/g
,.replace()
robi tylko pierwszy mecz.replace('a', 'b', 'g')
co działa tak samo jakreplace(/a/g, 'b')
... prędkość jest jednakowaWiem, że to stary, ale chciałem opublikować odmianę zaakceptowanej odpowiedzi , która zadziała w IE bez usuwania wierszy:
źródło
Podkreślać zapewnia
_.escape()
i_.unescape()
metody, które to robią.źródło
Dobra odpowiedź. Zauważ, że jeśli wartość do zakodowania to
undefined
lubnull
z jQuery 1.4.2, możesz otrzymać błędy takie jak:jQuery("<div/>").text(value).html is not a function
LUB
Uncaught TypeError: Object has no method 'html'
Rozwiązaniem jest zmodyfikowanie funkcji w celu sprawdzenia rzeczywistej wartości:
źródło
jQuery('<div/>').text(value || '').html()
value
zif
zapisami, które muszą stworzyć DIV w locie i zdobyć jego wartość. Może to być znacznie bardziej wydajne, jeślihtmlEncode
jest często nazywane ORAZ, jeśli jest prawdopodobne, żevalue
będzie puste.Dla tych, którzy wolą zwykły javascript, oto metoda, którą z powodzeniem zastosowałem:
źródło
FWIW, kodowanie nie jest tracone. Kodowanie jest używane przez analizator składni (przeglądarkę) podczas ładowania strony. Gdy źródło zostanie odczytane i przeanalizowane, a przeglądarka DOM załaduje się do pamięci, kodowanie zostanie przetworzone na to, co reprezentuje. Tak więc do czasu wykonania JS w celu odczytania czegokolwiek w pamięci, znak, jaki otrzymuje, jest reprezentowany przez kodowanie.
Być może działam tutaj wyłącznie w zakresie semantyki, ale chciałem, abyście zrozumieli cel kodowania. Słowo „zagubiony” sprawia, że wydaje się, że coś nie działa tak, jak powinno.
źródło
Szybciej bez Jquery. Możesz zakodować każdy znak w ciągu:
Lub po prostu celuj w głównych bohaterów, aby się martwić (&, inebreaks, <,>, "i '), takich jak:
źródło
Prototyp ma wbudowaną klasę String . Więc jeśli używasz / plan korzystania z Prototype, robi to coś takiego:
źródło
.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
Łatwo.Oto proste rozwiązanie javascript. Rozszerza obiekt String o metodę „HTMLEncode”, której można użyć na obiekcie bez parametru lub z parametrem.
Zrobiłem istotę „Metoda HTMLEncode dla javascript” .
źródło
Na podstawie dezynfekcji angulara ... (składnia modułu es6)
źródło
if (value === null | value === undefined) return '';
literówki czy właściwie funkcja? Jeśli tak, to po co używać tego, a nie zwykłego||
? Dziękuję Ci!!== null
?undefined
jest jedyną rzeczą, która ma być równoważnanull
, więc i tak dwa potrójne równe nie są koniecznenull
i0
obaj są fałszywi, tak, więc nie możesz tak po prostu zrobić!value
, ale chodzi o==
to, aby ułatwić pewne rzeczy.0 == null
to fałsz.undefined == null
jest prawdziwy. możesz po prostu zrobićvalue == null
O ile wiem, w javascript nie ma prostej metody kodowania / dekodowania HTML.
Możesz jednak użyć JS do utworzenia dowolnego elementu, ustawienia jego wewnętrznego tekstu, a następnie przeczytania go za pomocą innerHTML.
Powiedzmy, że z jQuery powinno to działać:
Lub coś podobnego.
źródło
Nie powinieneś uciekać / kodować wartości, aby przenieść je z jednego pola wejściowego do drugiego.
JS nie wstawia surowego HTMLa ani nic takiego; po prostu informuje DOM o ustawieniu
value
właściwości (lub atrybutu; nie jestem pewien). Tak czy inaczej, DOM obsługuje wszelkie problemy z kodowaniem. O ile nie robisz czegoś dziwnego, np. Używającdocument.write
lubeval
, kodowanie HTML będzie skutecznie przezroczyste.Jeśli mówisz o wygenerowaniu nowego pola tekstowego, które będzie zawierało wynik ... to nadal jest tak proste. Po prostu przekaż statyczną część kodu HTML do jQuery, a następnie ustaw resztę właściwości / atrybutów obiektu, który on zwraca.
źródło
Miałem podobny problem i rozwiązałem go za pomocą funkcji
encodeURIComponent
z JavaScript ( dokumentacja )Na przykład w twoim przypadku, jeśli używasz:
i
dostaniesz
chalk%20%26%20cheese
. Nawet miejsca są zachowane.W moim przypadku musiałem zakodować jeden ukośnik odwrotny i ten kod działa idealnie
i mam
name%2Fsurname
źródło
Oto trochę, która emuluje
Server.HTMLEncode
funkcję z ASP Microsoftu, napisaną w czystym JavaScript:Wynik nie koduje apostrofów, ale koduje inne specjalności HTML i wszelkie znaki spoza zakresu 0x20-0x7e.
źródło
Moja funkcja pure-JS:
źródło
Jeśli chcesz użyć jQuery. Znalazłem to:
http://www.jquerysdk.com/api/jQuery.htmlspecialchars
(część wtyczki jquery.string oferowana przez jQuery SDK)
Moim zdaniem problem z Prototypem polega na tym, że rozszerza on podstawowe obiekty w JavaScript i będzie niekompatybilny z jakimkolwiek jQuery, którego mogłeś użyć. Oczywiście, jeśli używasz już Prototypu, a nie jQuery, nie będzie problemu.
EDYCJA: Jest też to, co jest portem narzędzi ciągowych Prototype dla jQuery:
http://stilldesigning.com/dotstring/
źródło
Pochodzi z kodu źródłowego ExtJS.
źródło
Wyjdzie:
<script>alert("I hack your site")</script>
.htmlEncode () będzie dostępny we wszystkich ciągach po zdefiniowaniu.
źródło
HtmlEncodes podaną wartość
źródło
Wystąpiły problemy z odwrotnym ukośnikiem w moim ciągu Domain \ User.
Dodałem to do innych ucieczek od odpowiedzi Anentropic
Które znalazłem tutaj: Jak uciec ukośnik w JavaScript?
źródło
Wybieranie czynności
escapeHTML()
wykonywanych w pliku prototype.jsDodanie tego skryptu pomaga uciec HTML:
teraz możesz wywołać metodę escapeHTML dla ciągów w skrypcie, takich jak:
Mam nadzieję, że pomoże każdemu, kto szuka prostego rozwiązania, bez konieczności dołączania całego pliku prototype.js
źródło
Korzystając z niektórych innych odpowiedzi tutaj, stworzyłem wersję, która zastępuje wszystkie istotne znaki w jednym przejściu, niezależnie od liczby różnych zakodowanych znaków (tylko jedno wywołanie
replace()
), więc będzie szybsze dla większych ciągów.Nie polega na istnieniu interfejsu API DOM ani na innych bibliotekach.
Po uruchomieniu tego raz możesz teraz zadzwonić
Aby dostać
<>&"'
źródło
źródło