Jak mogę uciec ciąg wewnątrz kodu JavaScript wewnątrz programu obsługi onClick?

głosy
62

Może jestem po prostu myśleć o tym zbyt trudne, ale mam problem na zastanawianie się, co ucieka do wykorzystania na sznurku w jakiś kod JavaScript wewnątrz linku onClick obsługi. Przykład:

<a href=# onclick=SelectSurveyItem('<%itemid%>', '<%itemname%>'); return false;>Select</a>

<%itemid%>I <%itemname%>są tam, gdzie występuje na zmianę szablonu. Moim problemem jest to, że nazwa elementu może zawierać dowolny znak, w tym pojedyncze i podwójne cudzysłowy. Obecnie, jeśli zawiera apostrofów łamie kod JavaScript.

Moją pierwszą myślą było korzystać z funkcji języku szablon do JavaScript-uciec nazwę elementu, który właśnie ucieka cytaty. To nie rozwiąże sprawę napisu zawierającego cudzysłowów który łamie HTML łącza. Jak ten problem normalnie skierowana? Czy muszę HTML uciec całą obsługi onClick?

Jeśli tak, że wyglądają naprawdę dziwne, ponieważ funkcja escape języku szablon za które również HTMLify nawiasów, cytaty i średników ...

Ten link jest generowany dla każdego wyniku w stronie wyników wyszukiwania, więc tworząc odrębną metodę wewnątrz tagu JavaScript nie jest możliwe, ponieważ będę musiał wygenerować jeden na wynik.

Również używam silnika szablonów, który został home-grown w firmie, w której pracuję, więc specyficzne rozwiązania Toolkit będzie nie dla mnie.

Utwórz 18/09/2008 o 23:16
źródło użytkownik
W innych językach...                            


13 odpowiedzi

głosy
76

W JavaScript można zakodować apostrofów jak „X27 \” i cudzysłowach jak „X22 \”. Dlatego z tej metody można, gdy jesteś wewnątrz (pojedyncze lub podwójne) cytatów z ciągiem JavaScript dosłowny, użyj \ x27 \ x22 bezkarnie bez obawy o jakiekolwiek wbudowanych cytatów „wyrwanie się” swojego łańcucha.

\ xxx jest dla znaków <127 i \ uXXXX dla Unicode , więc uzbrojeni w tę wiedzę można stworzyć solidną JSEncode funkcję dla wszystkich znaków, które są poza zwykłym białej listy.

Na przykład,

<a href="#" onclick="SelectSurveyItem('<% JSEncode(itemid) %>', '<% JSEncode(itemname) %>'); return false;">Select</a>
Odpowiedział 18/09/2008 o 23:51
źródło użytkownik

głosy
20

W zależności od języka po stronie serwera, można użyć jednego z nich:

.NET 4.0

string result = System.Web.HttpUtility.JavaScriptStringEncode("jsString")

Jawa

import org.apache.commons.lang.StringEscapeUtils;
...

String result = StringEscapeUtils.escapeJavaScript(jsString);

Pyton

import json
result = json.dumps(jsString)

PHP

$result = strtr($jsString, array('\\' => '\\\\', "'" => "\\'", '"' => '\\"', 
                                 "\r" => '\\r', "\n" => '\\n' ));

Ruby on Rails

<%= escape_javascript(jsString) %>
Odpowiedział 23/12/2011 o 04:15
źródło użytkownik

głosy
10

Użyj ukrytych przęseł, po jednym dla każdego z parametrów <%itemid%>i <%itemname%>i pisać swoje wartości wewnątrz nich.

Na przykład, dla rozpiętość <%itemid%>będzie wyglądać <span id='itemid' style='display:none'><%itemid%></span>iw funkcji javascript SelectSurveyItem, aby odebrać argumenty z tych przęseł innerHTML.

Odpowiedział 03/02/2009 o 09:27
źródło użytkownik

głosy
9

Spróbuj unikać String literały w kodzie HTML i użyć JavaScript powiązać zdarzenia JavaScript.

Należy również unikać href = „#”, chyba że naprawdę wiesz co robisz. Łamie tyle użyteczność dla kompulsywnych middleclickers (otwieracza).

<a id="tehbutton" href="somewhereToGoWithoutWorkingJavascript.com">Select</a>

Moja biblioteka JavaScript wyboru okazuje się być jQuery:

<script type="text/javascript">//<!-- <![CDATA[
jQuery(function($){
   $("#tehbutton").click(function(){
        SelectSurveyItem('<%itemid%>', '<%itemname%>');
        return false;
   });
});
//]]>--></script>

Jeśli zdarzy ci się być trójwymiarowa listę linków tak, możesz to zrobić:

<a id="link_1" href="foo">Bar</a>
<a id="link_2" href="foo2">Baz</a>

<script type="text/javascript">
   jQuery(function($){
        var l = [[1,'Bar'],[2,'Baz']];
        $(l).each(function(k,v){
           $("#link_" + v[0] ).click(function(){
                SelectSurveyItem(v[0],v[1]);
                return false;
           });
        });
   });
 </script>
Odpowiedział 18/09/2008 o 23:35
źródło użytkownik

głosy
8

Jeśli tak się dzieje do atrybutu HTML, trzeba zarówno HTML zakodować (jako minimum: >do &gt; <celu &lti "do &quot;) go i uciec apostrofy (z odwrotnym ukośnikiem), tak aby nie zakłócać cytując JavaScript.

Najlepszym sposobem na to jest z systemem szablonów (rozszerzenie go, jeśli to konieczne), ale można po prostu zrobić kilka uciekających / funkcji kodowania i owinąć je zarówno wokół wszelkich danych, które się dzieje w środku.

I tak, to jest całkowicie poprawny (poprawne, nawet) do HTML-ucieczki całą zawartość swoich atrybutów HTML, nawet jeśli zawierają one JavaScript.

Odpowiedział 18/09/2008 o 23:21
źródło użytkownik

głosy
3

Innym ciekawym rozwiązaniem może być w tym celu:

<a href="#" itemid="<%itemid%>" itemname="<%itemname%>" onclick="SelectSurveyItem(this.itemid, this.itemname); return false;">Select</a>

Następnie można użyć standardowego HTML-kodowanie na obu zmiennych, bez konieczności martwienia się o dodatkowej komplikacji javascript cytowania.

Tak, to ma tworzyć HTML, który jest bezwzględnie nieważna. Jednak to jest ważna technika, a wszystkie nowoczesne przeglądarki obsługują go.

Gdyby to był mój, pewnie bym go z moją pierwszą sugestią i zapewnienie wartości są zakodowane HTML i mają pojedyncze cudzysłowy uciekł.

Odpowiedział 18/09/2008 o 23:41
źródło użytkownik

głosy
1

I w obliczu tego problemu, jak również. Zrobiłem skrypt do konwersji apostrofów do zbiegłych cudzysłowach, które nie złamie HTML.

function noQuote(text)
{
    var newtext = "";
    for (var i = 0; i < text.length; i++) {
        if (text[i] == "'") {
            newtext += "\"";
        }
        else {
            newtext += text[i];
        }
    }
    return newtext;
}
Odpowiedział 16/02/2012 o 00:28
źródło użytkownik

głosy
1

Po pierwsze, byłoby prostsze, jeśli onclick obsługi została ustalona w następujący sposób:

<a id="someLinkId"href="#">Select</a>
<script type="text/javascript">
  document.getElementById("someLinkId").onClick = 
   function() {
      SelectSurveyItem('<%itemid%>', '<%itemname%>'); return false;
    };

</script>

Następnie ItemID i itemName trzeba uciec do JavaScript (czyli "staje się \", etc.).

Jeśli używasz Java po stronie serwera, można spojrzeć na klasę StringEscapeUtils z Dżakarty za wspólnym-lang. W przeciwnym razie, nie powinno trwać zbyt długo, aby napisać swój własny „escapeJavascript” metodę.

Odpowiedział 18/09/2008 o 23:32
źródło użytkownik

głosy
1

Użyj biblioteki Microsoft Anti-XSS , który obejmuje kodowanie JavaScript.

Odpowiedział 18/09/2008 o 23:18
źródło użytkownik

głosy
1

Oświadczam, oddzielne funkcje w sekcji <head> i powoływać tych, w swoim sposobie onClick. Jeśli masz dużo można użyć schematu nazewnictwa numery je lub przekazać liczbą całkowitą w swoim onClicks i mają duży switch tłuszczu w funkcji.

Odpowiedział 18/09/2008 o 23:18
źródło użytkownik

głosy
0

I w obliczu tego samego problemu, a ja rozwiązać go w trudne drogi. Najpierw upewnij zmiennych globalnych, V1, V2 i V3. Aw onclick, wyślij wskaźnika, 1, 2 lub 3, a w kontroli działania 1, 2, 3, aby umieścić V1, V2, V3 jak:

onclick="myfun(1)"
onclick="myfun(2)"
onclick="myfun(3)"

function myfun(var)
{
    if (var ==1)
        alert(v1);

    if (var ==2)
        alert(v2);

    if (var ==3)
        alert(v3);
}
Odpowiedział 11/03/2011 o 14:05
źródło użytkownik

głosy
0

Każdy dobry silnik szablonów wart jego sól będzie miał funkcję „Ucieczka cudzysłów”. Ours (również home-grown, gdzie pracuję) posiada również funkcję ucieczki ofert dla javascript. W obu przypadkach, zmienna szablon jest to po prostu dołączane z _esc lub _js_esc, w zależności od których chcesz. Nigdy nie należy wyjście generowane przez użytkowników treści do przeglądarki, która nie została uciekł, IMHO.

Odpowiedział 19/09/2008 o 16:20
źródło użytkownik

głosy
0

Czy odpowiedzi tutaj, że nie można uciec cytaty za pomocą JavaScript i że trzeba zacząć uciekły strun.

W związku z tym. Nie ma mowy o JavaScript jest w stanie obsłużyć ciąg „Marge powiedział«Chciałbym wyglądać, że było»Peter” i trzeba swoje dane być czyszczone przed zaoferowaniem go do skryptu?

Odpowiedział 19/09/2008 o 12:35
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more