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.

TIMEX
źródło
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()')
Joe
źródło
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()'
nicolaskruchten
źródło
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'
Kamrul
źródło
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'
Flimm
źródło
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

John Culviner
źródło