2013-05-18 20 views
119

Próbuję wysłać wiadomość GET zawierającą ciągi znaków ze znakami handlowymi i nie można wymyślić, jak uciec przed znakiem ampersand w adresie URL.Uciekający znak ampersand w adresie URL

Przykład:

http://www.example.com?candy_name=M&M 
result => candy_name = M 

Próbowałem również:

http://www.example.com?candy_name=M\&M 
result => candy_name = M\\ 

Używam adresy URL ręcznie, więc wystarczy odpowiednie znaki.

Nie mogę używać żadnych bibliotek. Jak można to zrobić?

Odpowiedz

219

Muszą być procent zakodowane:

> encodeURIComponent('&') 
"%26" 

Więc w twoim przypadku, adres URL będzie wyglądać następująco:

http://www.mysite.com?candy_name=M%26M 
+1

: -% 26 nie działa dla mnie. Czy istnieje jakieś inne rozwiązanie? – Sanjiv

+0

@Sanjiv: co masz na myśli mówiąc "nie działa"? – Blender

+1

Kiedy zamieniam i na% 26, nadal wyświetla się ten sam błąd: 'Potencjalnie niebezpieczna wartość Request.Path została wykryta przez klienta (&).' – Sanjiv

5

Spróbuj użyć http://www.mysite.com?candy_name=M%26M.

Zobacz także ten reference i trochę więcej informacji na temat wikipedia.

2

Możesz użyć znaku% do znaków "escape", które nie są dozwolone w adresach URL. Zobacz RFC1738.

Tabela wartości ASCII jest tutaj: http://www.asciitable.com/

Widać & jest 26 w hex - tak, co trzeba jest M% 26M

27

nie zastosowanie tylko do ampersand w adresach URL , ale dla wszystkich reserved characters. Niektóre z nich to:

# $ & + ,/: ; = ? @ [ ] 

Idea jest taka sama jak kodująca & w dokumencie HTML, ale z kontekstu nie zmieniła się w ciągu URI, oprócz tego, że w dokumencie HTML. Tak więc kodowanie procentowe zapobiega problemom z analizą wewnątrz obu kontekstów.

Miejsce, w którym bardzo się to przydaje, polega na umieszczeniu adresu URL w innym adresie URL. Na przykład, jeśli chcesz opublikować status na Twitterze:

http://www.twitter.com/intent/tweet?status=What%27s%20up%2C%20StackOverflow%3F(http%3A%2F%2Fwww.stackoverflow.com) 

Jest wiele znaków zastrzeżonych w moim Tweet, mianowicie ?'():/, więc zakodowane całą wartość parametru status URL. Jest to również przydatne podczas korzystania z łączy mailto: zawierających treść wiadomości lub temat, ponieważ musisz zakodować parametry body i subject, aby zachować nienaruszone podziały wierszy, znaki jakości itp.

Kiedy postać z zastrzeżonego zbioru (a "zastrzeżony znak") ma specjalnego znaczenia (a "Reserved purpose") w pewnym kontekście, a schemat URI mówi, że jest to niezbędne do korzystania z tego znaku dla jakiegoś innego celu , znak musi być zakodowany procentowo.Kodowanie procentowe Znak zarezerwowany polega na konwersji znaku na jego odpowiednią wartość bajtu w ASCII, a następnie reprezentowaniu tej wartości jako pary cyfr szesnastkowych. Cyfry poprzedzone znakiem procentowym ("%"), który jest używany jako znak escape, są następnie używane w identyfikatorze URI w miejsce zarezerwowanego znaku. (Dla znaku spoza ASCII jest to zwykle konwertowane na jego sekwencję bajtową w UTF-8, a następnie każda wartość bajtu jest reprezentowana jak powyżej.) Zarezerwowany znak "/" dla przykładu , jeśli jest używany w " ścieżka "komponent URI, ma specjalny znacznik oznaczający odgraniczenie między segmentami ścieżki. Jeśli zgodnie z podanym schematem URI , "/" musi znajdować się w segmencie ścieżki, wówczas trzy znaki "% 2F" lub "% 2f" muszą być użyte w segmencie zamiast surowego "/".

http://en.wikipedia.org/wiki/Percent-encoding#Percent-encoding_reserved_characters

+2

Wśród powyższej listy "! "() *" nie są kodowane za pomocą adresu URL za pomocą 'encodeURIComponent'. –

0
// this may help if someone want by php 
$variable ="candy_name=M&M"; 
$variable = str_replace("&","%26",$variable); 
Powiązane problemy