Jak mogę kodować URl w Node.js?


314

Chcę, aby adres URL zakodował to:

SELECT name FROM user WHERE uid = me() 

Czy muszę do tego pobrać moduł? Mam już moduł żądania.


8
Rzeczywiście jest to śliska droga i należy jej unikać za wszelką cenę.
Alfred

19
Czy próbujesz umieścić instrukcję SQL w swoim adresie URL? uważaj na atak SQL Injection ! Zasadniczo udostępnianie kodu SQL użytkownikom jest złym pomysłem, jest to naprawdę niebezpieczne.
Leonmax,

4
@LightnessRacesinOrbit: wygląda jak zapytanie FQL.
nikc.org,

2
@Demi: Nie? Jak by to działało. Uprawnienia DBMS nie są wystarczająco szczegółowe, nawet jeśli każdy użytkownik SO ma własne konto DB. Powiedz mi, gdzie na SO widzisz zapytania SQL przekazywane bezpośrednio? Jedynym wyjątkiem jest eksplorator danych, ale to tylko widoki tylko do odczytu i na pewno nie jest on umieszczony w adresie URL.
Wyścigi lekkości na orbicie

17
Facet mógłby budować narzędzie do sprawdzania poprawności SQL, nic złego w przekazywaniu poleceń SQL w takim przykładzie. Zbyt duży nacisk na nie odpowiadanie na pytanie i dawanie dobrych rad (najbardziej uprzywilejowany komentarz nie daje dobrych rad, tylko żartuje z OP)
Rafael Eyng

Odpowiedzi:


598

Możesz użyć JavaScript encodeURIComponent:

encodeURIComponent('select * from table where i()')

31
Aby zapisać odwiedzającym wyszukiwanie, tak ... decodeURIComponentto sposób, w jaki dekodujesz zakodowany URI. Nie ma za co.
KyleFarris

125

Wbudowany moduł querystringjest tym, czego szukasz:

var querystring = require("querystring");
var result = querystring.stringify({query: "SELECT name FROM user WHERE uid = me()"});
console.log(result);
#prints 'query=SELECT%20name%20FROM%20user%20WHERE%20uid%20%3D%20me()'

4
w tym przypadku możemy przekazać mapę, a nie ciąg znaków, więc jeśli arg jest ciągiem, to nic nie zobaczysz. Więc jeśli masz ciągi do kodowania, użyj encodeURIComponent ().
Ankit Patial

1
Jest to lepsze do kodowania obiektów JSON i ich POST.
Alex W

Nie, jeśli ciąg zawiera znaki „lub”
Jkarttunen,

47

Skorzystaj z escapefunkcji querystring. Generuje bezpieczny ciąg adresu URL.

var escaped_str = require('querystring').escape('Photo on 30-11-12 at 8.09 AM #2.jpg');
console.log(escaped_str);
// prints 'Photo%20on%2030-11-12%20at%208.09%20AM%20%232.jpg'

1
To zdecydowanie wydaje się być poprawną funkcją; querystring.stringify()(w odpowiedzi Nicolasa) wydaje się teraz zwracać pusty ciąg.
brandonscript

4
nodejs.org/api/… mówi: „ querystring.escape()Metodę tę stosuje querystring.stringify()i na ogół nie oczekuje się, że będzie stosowana bezpośrednio”.
Simon Hänisch

17

Pamiętaj, że kodowanie URI jest dobre dla części zapytania, nie jest dobre dla domeny. Domena zostaje zakodowana przy użyciu punycode. Potrzebujesz biblioteki takiej jak URI.js do konwersji między URI i IRI (internacjonalizowany identyfikator zasobu).

Jest to poprawne, jeśli planujesz użyć ciągu później jako ciągu zapytania:

> encodeURIComponent("http://examplé.org/rosé?rosé=rosé")
'http%3A%2F%2Fexampl%C3%A9.org%2Fros%C3%A9%3Fros%C3%A9%3Dros%C3%A9'

Jeśli nie chcesz, aby znaki ASCII, takie jak i /, były oznaczone znakiem ucieczki, użyj zamiast tego::?encodeURI

> encodeURI("http://examplé.org/rosé?rosé=rosé")
'http://exampl%C3%A9.org/ros%C3%A9?ros%C3%A9=ros%C3%A9'

Jednak w innych przypadkach użycia może być konieczne użycie uri-js :

> var URI = require("uri-js");
undefined
> URI.serialize(URI.parse("http://examplé.org/rosé?rosé=rosé"))
'http://xn--exampl-gva.org/ros%C3%A9?ros%C3%A9=ros%C3%A9'

12

encodeURIComponent (string) zrobi to:

encodeURIComponent("Robert'); DROP TABLE Students;--")
//>> "Robert')%3B%20DROP%20TABLE%20Students%3B--"

Przekazywanie SQL w ciągu zapytania może nie być dobrym planem,

zobacz ten

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.