Mam listę rozwijaną na stronie internetowej, która pęka, gdy ciąg wartości zawiera cytat.
Wartość wynosi "asd
, ale w DOM zawsze pojawia się jako pusty ciąg.
Próbowałem wszystkiego, co wiem, aby właściwie uciec z łańcucha, ale bezskutecznie.
<option value=""asd">test</option>
<option value="\"asd">test</option>
<option value=""asd">test</option>
<option value=""asd">test</option>
Jak renderować to na stronie, aby komunikat zwrotny zawierał poprawną wartość?
htmlentities
.Odpowiedzi:
"
jest właściwy sposób, trzeci z twoich testów:Możesz zobaczyć, jak działa to poniżej, lub na jsFiddle .
Alternatywnie możesz wyznaczyć wartość atrybutu pojedynczymi cudzysłowami:
źródło
"
odwzorowuje na ten sam znak co"
, ale nie ma tu żadnej korzyści z używania opcji numerycznej, ponieważ"
jest to zdefiniowany obiekt o nazwie."
jest również łatwiejsze do zapamiętania.&quot;a
(wymienić&
z&
)Jeśli używasz PHP, spróbuj zadzwonić
htmlentities
lubhtmlspecialchars
zadziałać.źródło
<option value='<?php echo htmlentities("' onmouseover='alert(123);' foo='"); ?>' />
- upewnij się, że używasz go z ENT_QUOTES, jest to bezpieczne:<option value='<?php echo htmlentities("' onmouseover='alert(123);' foo='", ENT_QUOTES); ?>' />
ale oprócz ENT_QUOTES powinieneś również dodać ENT_SUBSTITUTE i ENT_DISALLOWED, osobiście używam tego opakowania od lat:function hhb_tohtml(string $str):string { return htmlentities($str, ENT_QUOTES | ENT_HTML401 | ENT_SUBSTITUTE | ENT_DISALLOWED, 'UTF-8', true); }
Zgodnie ze składnią HTML , a nawet HTML5 , wszystkie prawidłowe opcje są następujące:
Zauważ, że jeśli używasz składni XML, cudzysłowy (pojedyncze lub podwójne) są wymagane.
Oto jsfiddle pokazujący wszystkie powyższe działające .
źródło
Inną opcją jest zastąpienie podwójnych cudzysłowów pojedynczymi cudzysłowami, jeśli nie masz nic przeciwko. Ale nie wspominam o tym:
Wspominam o tym:
W moim przypadku skorzystałem z tego rozwiązania.
źródło
Jeśli używasz Javascript i Lodash, możesz użyć _.escape (), która ucieka przed znakami „,”, <,> i &.
Zobacz tutaj: https://lodash.com/docs/#escape
źródło
Naprawdę powinieneś dopuszczać tylko niezaufane dane do białej listy dobrych atrybutów, takich jak: wyrównaj, alink, alt, bgcolor, border, pad do komórek, odstępy między komórkami, klasa, kolor, cols, colspan, coords, dir, face, height, hspace, ismap, lang , marginheight, marginwidth, multiple, nohref, noresize, noshade, nowrap, ref, rel, rev, wiersze, rozpiętość wierszy, przewijanie, kształt, zakres, podsumowanie, tabindex, tytuł, usemap, valign, wartość, vlink, vspace, szerokość
Naprawdę chcesz ukryć niezaufane dane w procedurach obsługi javascript, a także w atrybutach id lub name (mogą blokować inne elementy w DOM).
Ponadto, jeśli umieszczasz niezaufane dane w atrybucie SRC lub HREF, to jest to naprawdę niezaufany adres URL, więc powinieneś sprawdzić poprawność adresu URL, upewnić się, że NIE jest to JavaScript: URL, a następnie kodowanie encji HTML.
Więcej szczegółów na temat wszystkich dostępnych tutaj: https://www.owasp.org/index.php/Abridged_XSS_Prevention_Cheat_Sheet
źródło
Nie ma sposobu na uniknięcie cudzysłowów w wartości tekstu wejściowego ... ale możesz użyć javascript (lub jquery):
źródło