Generuję wartości z bazy danych (tak naprawdę nie jest otwarta na publiczne wejście, ale jest otwarta na wejście dla użytkownika w firmie - co oznacza, że nie martwię się o XSS ).
Próbuję wygenerować taki tag:
<a href="" onclick="DoEdit('DESCRIPTION');">Click Me</a>
OPIS to tak naprawdę wartość z bazy danych, która wygląda mniej więcej tak:
Prelim Assess "Mini" Report
Próbowałem zamienić „na \”, ale bez względu na to, co próbuję, Firefox przerywa moje wywołanie JavaScript po spacji po słowie Assess i powoduje wiele problemów.
Muszę odmówić oczywistej odpowiedzi, ale nie potrafię tego rozgryźć przez całe życie.
Czy ktoś chciałby zwrócić uwagę na moją idiotyzm?
Oto cała strona HTML (ostatecznie będzie to strona ASP.NET , ale aby to rozwiązać, wyjąłem wszystko inne oprócz kodu problemu)
<html>
<body>
<a href="#" onclick="DoEdit('Preliminary Assessment \"Mini\"'); return false;">edit</a>
</body>
</html>
javascript
quotes
escaping
Matt Dawdy
źródło
źródło
onclick
załącznik do wydarzenia był dyskretny i przenieść wszystkie informacje z bazy danych na wyspę danych. Wszystko będzie czystsze, a gdy nie uda ci się uniknąć znaków, pojawi się błąd składniowy.Odpowiedzi:
Musisz usunąć ciąg, w którym piszesz,
DoEdit
aby wyszorować znaki podwójnego cudzysłowu. Powodująonclick
przedwczesne zamknięcie atrybutu HTML.Użycie znaku zmiany znaczenia JavaScript
\
nie jest wystarczające w kontekście HTML. Trzeba wymienić cudzysłów z właściwej reprezentacji XML podmiotu,"
.źródło
'mystring'.replace(/"/g, '"');
"
działałby w tym konkretnym przypadku, jak zasugerowano mi wcześniej, ze względu na kontekst HTML.Jeśli jednak chcesz, aby kod JavaScript był niezależnie zmieniany niezależnie od kontekstu, możesz wybrać natywne kodowanie JavaScript:
'
staje\x27
"
się\x22
Twoje kliknięcie stałoby się:
DoEdit('Preliminary Assessment \x22Mini\x22');
Działałoby to na przykład również przy przekazywaniu ciągu JavaScript jako parametru do innej metody JavaScript (
alert()
jest to łatwa metoda testowa).Odsyłam cię do duplikatu pytania o przepełnienie stosu. Jak mogę uniknąć ciągu w kodzie JavaScript w module obsługi onClick? .
źródło
"
będzie oczywiście działać."
jest to wymagane w wartościach wejściowych, tzn.<input value="\x22quoted string\x22">
Nie będzie działać.onclick="..."
). Wartośćvalue
atrybutu nie jest przetwarzana w kontekście JavaScript, tylko w kontekście HTML.'mystring'.replace(/"/g, '\\x22').replace(/'/g, '\\x27')
Powinien załatwić sprawę.
źródło
Ludzie,
unescape
w JavaScripcie jest już dostępna funkcja, która wykonuje odwzorowanie dla\"
:źródło
Problem polega na tym, że HTML nie rozpoznaje znaku zmiany znaczenia. Można obejść ten problem, używając pojedynczych cudzysłowów dla atrybutu HTML i podwójnych cudzysłowów dla kliknięcia.
źródło
Zasadniczo tak to robię
str.replace(/[\""]/g, '\\"')
.źródło
Jeśli składasz HTML w Javie, możesz użyć tej ładnej klasy narzędziowej z Apache commons-lang, aby poprawnie wykonać wszystkie zmiany znaczenia:
źródło
Zrobiłem przykładowy przy użyciu jQuery
I to działa w Internet Explorer i Firefox.
źródło
Możesz skopiować te dwie funkcje (wymienione poniżej) i użyć ich do zmiany / cofnięcia widoku wszystkich cudzysłowów i znaków specjalnych. Nie musisz do tego używać jQuery ani żadnej innej biblioteki.
źródło
Poniżej znajduje się kod, który unika pojedynczych cudzysłowów jako części wprowadzonego ciągu przy użyciu wyrażenia regularnego. Sprawdza, czy ciąg wprowadzony przez użytkownika jest oddzielony przecinkami, a jednocześnie unika nawet pojedynczych cudzysłowów wprowadzonych jako część ciągu.
Aby uniknąć pojedynczych cudzysłowów, po prostu wprowadź ukośnik wstecz, a następnie pojedynczy cudzysłów, taki jak: \ ' jako część ciągu. W tym przykładzie użyłem walidatora jQuery i możesz go używać według swojej wygody.
Prawidłowe ciągi znaków:
'Dzień dobry'
'Witaj świecie'
'Witaj świecie'
'Witaj świecie',' '
„To mój świat”, „Nie mogę się tym cieszyć beze mnie”, „Witamy, Gość”
HTML:
JavaScript:
źródło
Unikaj również białych znaków. Wydaje mi się, że Firefox zakłada trzy argumenty zamiast jednego.
to nierozerwalna postać spacji. Nawet jeśli to nie jest cały problem, może być dobrym pomysłem.źródło
Musisz unikać cudzysłowów z podwójnymi ukośnikami odwrotnymi.
To się nie powiedzie (wyprodukowane przez json_encode PHP ):
To działa:
źródło
Możesz użyć metod jQuery escape () i unescape (). Jak poniżej
Użyj,
escape(str);
aby uciec z łańcucha i odzyskać ponownie za pomocąunescape(str_esc);
.źródło