Jak bezpiecznie kodować adres URL za pomocą JavaScript, aby można go było umieścić w ciągu GET?
var myUrl = "http://example.com/index.html?param=1&anotherParam=2";
var myOtherUrl = "http://example.com/index.html?url=" + myUrl;
Zakładam, że musisz zakodować myUrl
zmienną w tym drugim wierszu?
javascript
url
urlencode
pseudonim
źródło
źródło
Odpowiedzi:
Sprawdź wbudowaną funkcję encodeURIComponent (str) i encodeURI (str) .
W twoim przypadku powinno to działać:
źródło
escape
jest również prawidłową opcją.encodeURI
nie jest tak naprawdę bezpieczne dla kodowania URL.:
,/
,@
itd. Te 2 metody nie mogą być używane zamiennie, trzeba wiedzieć, co kodowania użyć odpowiedniej metody.Masz trzy opcje:
escape()
nie koduje:@*/+
encodeURI()
nie koduje:~!@#$&*()=:/,;?+'
encodeURIComponent()
nie koduje:~!*()'
Ale w twoim przypadku, jeśli chcesz przekazać adres URL do
GET
parametru innej strony, powinieneś użyćescape
lubencodeURIComponent
, ale nieencodeURI
.Zobacz pytanie Przepełnienie stosu Najlepsza praktyka: ucieczka lub encodeURI / encodeURIComponent w celu dalszej dyskusji.
źródło
%uxxx
.Trzymaj się
encodeURIComponent()
. FunkcjaencodeURI()
nie zawraca sobie głowy kodowaniem wielu znaków o znaczeniu semantycznym w adresach URL (np. „#”, „?” I „&”).escape()
jest przestarzałe i nie zawraca sobie głowy kodowaniem znaków „+”, które będą interpretowane jako zakodowane spacje na serwerze (i, jak wskazali tutaj inni, nie kodują poprawnie znaków spoza ASCII kodujących adresy URL).Jest ładne wyjaśnienie różnicy między
encodeURI()
iencodeURIComponent()
gdzie indziej. Jeśli chcesz zakodować coś, aby można go było bezpiecznie dołączyć jako składnik identyfikatora URI (np. Jako parametr ciągu zapytania), chcesz go użyćencodeURIComponent()
.źródło
Najlepszą odpowiedzią jest użycie
encodeURIComponent
na wartości w ciągu kwerendy (i nigdzie indziej).Uważam jednak, że wiele interfejsów API chce zastąpić „” „” „”, więc musiałem użyć następujących opcji:
escape
jest różnie zaimplementowany w różnych przeglądarkach iencodeURI
nie koduje wielu znaków (takich jak #, a nawet /) - jest przeznaczony do użycia na pełnym identyfikatorze URI / URL bez jego uszkodzenia - co nie jest zbyt pomocne ani bezpieczne.I jak wskazuje @Jochem poniżej, możesz chcieć używać
encodeURIComponent()
nazwy (każdego) folderu, ale z jakiegokolwiek powodu te interfejsy API wydają się nie chcieć+
w nazwach folderów, więc zwykły staryencodeURIComponent
działa świetnie.Przykład:
źródło
http://somedomain/this dir has spaces/info.php?a=this has also spaces
. Powinien zostać przekonwertowany na:http://somedomain/this%20dir%20has%spaces/info.php?a=this%20has%20also%20spaces
ale wiele implementacji pozwala na zastąpienie „% 20” w zapytaniu przez „+”. Niemniej jednak nie można zamienić „% 20” na „+” w sekcji ścieżki adresu URL, spowoduje to błąd Nie znaleziono, chyba że masz katalog z+
spacją.encodeURIComponent('+')
dałby wam%2B
, więc musielibyście użyć dwóch wyrażeń regularnych ... co, jak sądzę, jest trochę powodem, dlaczego to działa, ponieważ „+” są ”są ostatecznie zakodowane inaczej.Jeśli używasz jQuery, wybrałbym
$.param
metodę. Adres URL koduje pola mapowania obiektów na wartości, co jest łatwiejsze do odczytania niż wywołanie metody zmiany znaczenia dla każdej wartości.źródło
encodeURIComponent () jest właściwą drogą.
ALE należy pamiętać, że istnieją niewielkie różnice w stosunku do wersji php
urlencode()
i jak wspomniano w @CMS, nie koduje każdego znaku. Faceci na http://phpjs.org/functions/urlencode/ uczynili js równoważnym zphpencode()
:źródło
Aby zakodować adres URL, jak powiedziano wcześniej, masz dwie funkcje:
i
Powodem tego jest to, że pierwszy zachowuje adres URL z ryzykiem pozostawienia zbyt wielu rzeczy bez zmian, a drugi koduje wszystko, co potrzebne.
Za pomocą pierwszego możesz skopiować nowo ocalony adres URL do paska adresu (na przykład) i działałoby. Jakkolwiek twoje nieskalowane '&' 'zakłócałyby ograniczniki pól,' = 'zakłócałyby nazwy i wartości pól, a' + 'wyglądałyby jak spacje. Ale w przypadku prostych danych, gdy chcesz zachować charakter URL tego, co uciekasz, działa to.
Drugi to wszystko, co musisz zrobić, aby upewnić się, że nic w ciągu nie koliduje z adresem URL. Pozostawia różne nieistotne znaki bez zmian, dzięki czemu adres URL pozostaje jak najbardziej czytelny dla człowieka bez ingerencji. Zakodowany w ten sposób adres URL nie będzie już działał jako adres URL bez jego usunięcia.
Jeśli więc możesz poświęcić trochę czasu, zawsze chcesz użyć encodeURIComponent () - przed dodaniem par nazwa / wartość zakoduj zarówno nazwę, jak i wartość za pomocą tej funkcji przed dodaniem jej do ciągu zapytania.
Trudno mi wymyślić powody, by użyć encodeURI () - pozostawię to mądrzejszym ludziom.
źródło
Podobne rzeczy próbowałem z normalnym javascript
źródło
Elegancki sposób
Moim skromnym zdaniem najbardziej eleganckim sposobem kodowania parametrów zapytań jest utworzenie obiektu o takich parametrach
a następnie koduj za pomocą:
jak wspomniano w tej odpowiedzi: https://stackoverflow.com/a/53171438/7284582
źródło
Aby uniknąć podwójnego kodowania, dobrym pomysłem jest odkodowanie adresu URL przed kodowaniem (jeśli masz do czynienia np. Z wpisanymi przez użytkownika adresami URL, które mogą być już zakodowane).
Powiedzmy, że mamy
abc%20xyz 123
dane wejściowe (jedna spacja jest już zakodowana):źródło
Co to jest kodowanie adresów URL:
Adres URL należy zakodować, jeśli wewnątrz adresu URL znajdują się znaki specjalne. Na przykład:
W tym przykładzie możemy zauważyć, że wszystkie znaki oprócz łańcucha
notEncoded
są kodowane znakami%. Kodowanie URL jest również znane jako kodowanie procentowe, ponieważ unika wszystkich znaków specjalnych za pomocą%. Następnie po tym znaku% każdy znak specjalny ma unikalny kodDlaczego potrzebujemy kodowania adresów URL:
Niektóre znaki mają specjalną wartość w ciągu adresu URL. Na przykład? znak oznacza początek ciągu zapytania. Aby z powodzeniem zlokalizować zasób w sieci, konieczne jest rozróżnienie, kiedy znak ma być ciągiem znaków lub częścią struktury adresu URL.
Jak możemy osiągnąć kodowanie URL w JS:
JS oferuje kilka wbudowanych funkcji narzędziowych, których możemy użyć do łatwego kodowania adresów URL. Są to dwie wygodne opcje:
encodeURIComponent()
: Bierze składnik URI jako argument i zwraca zakodowany ciąg URI.encodeURI()
: Bierze URI jako argument i zwraca zakodowany ciąg URI.Przykład i zastrzeżenia:
Pamiętaj, aby nie przekazywać całego adresu URL (w tym schematu, np. Https: //) do
encodeURIComponent()
. To może faktycznie przekształcić go w niedziałający adres URL. Na przykład:Widzimy, że umieszczamy cały adres URL w
encodeURIComponent
taki sposób, że ukośniki (/) są również konwertowane na znaki specjalne. Spowoduje to, że adres URL przestanie działać poprawnie.Dlatego (jak sama nazwa wskazuje) użyj:
encodeURIComponent
na pewną część adresu URL, który chcesz zakodować.encodeURI
na cały adres URL, który chcesz zakodować.źródło
Nic mi nie działało. Wszystko, co widziałem, to HTML strony logowania, która wraca na stronę klienta z kodem 200. (na początku 302, ale ta sama prośba Ajax ładuje stronę logowania w innym żądaniu Ajax, która miała być przekierowaniem, a nie ładowaniem zwykłego tekst strony logowania).
W kontrolerze logowania dodałem tę linię:
I w globalnym module obsługi Ajax zrobiłem to:
Teraz nie mam żadnego problemu i działa jak urok.
źródło
Zakoduj ciąg adresu URL
źródło
Oto LIVE DEMO od
encodeURIComponent()
idecodeURIComponent()
JS wbudowanych funkcji:źródło
Możesz użyć biblioteki esapi i zakodować swój adres URL za pomocą poniższej funkcji. Funkcja zapewnia, że „/” nie zostaną utracone podczas kodowania, podczas gdy pozostała zawartość tekstu jest kodowana:
https://www.owasp.org/index.php/ESAPI_JavaScript_Readme
źródło
Użyj
fixedEncodeURIComponent
funkcji, aby ściśle przestrzegać RFC 3986 :źródło
Nie należy używać
encodeURIComponent()
bezpośrednio.Spójrz na RFC3986: Uniform Resource Identifier (URI): Generic Składnia
Te zastrzeżone znaki z definicji URI w RFC3986 NIE SĄ znakami ucieczki
encodeURIComponent()
.Dokumenty sieciowe MDN: encodeURIComponent ()
Użyj funkcji MDN Web Docs ...
źródło