Como codifico o URl em Node.js?

314

Quero URL codificar isso:

SELECT name FROM user WHERE uid = me() 

Tenho que baixar um módulo para isso? Eu já tenho o módulo de solicitação.

TIMEX
fonte
8
De fato, esta é uma estrada escorregadia e deve ser evitada a todo custo.
Alfred
19
Você está tentando colocar a instrução SQL no seu URL ??? tenha cuidado com o ataque de injeção de SQL ! Geralmente, é uma má idéia expor o SQL aos usuários, é realmente perigoso.
Leonmax
4
@LightnessRacesinOrbit: parece uma consulta FQL.
Nikc.org
2
@ Demi: Não? Como isso funcionaria? As permissões do DBMS não são suficientemente refinadas, mesmo que todo usuário de SO tenha sua própria conta de banco de dados. Diga-me onde você vê as consultas SQL passadas diretamente? A única exceção é o explorador de dados, mas isso é tudo visualizações somente leitura, e certamente não é colocado na URL.
Lightness Races in Orbit
17
O cara pode estar criando uma ferramenta de validação SQL, nada de errado em passar comandos SQL em um exemplo como esse. Muito foco em não responder a pergunta não dando bons conselhos (o comentário mais upvoted não dá bons conselhos, só faz o divertimento do OP)
Rafael Eyng

Respostas:

598

Você pode usar JavaScript encodeURIComponent:

encodeURIComponent('select * from table where i()')
Joe
fonte
31
Para salvar uma pesquisa aos visitantes, sim ... decodeURIComponenté como você decodifica o URI codificado. De nada.
KryFarris 02/04
125

O módulo embutido querystringé o que você está procurando:

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
fonte
4
neste caso, podemos apenas passar um mapa e não uma string, portanto, se arg é uma string, você não verá nada no resultado. Portanto, se você tiver seqüências de caracteres para codificar, use encodeURIComponent ().
Ankit Patial
1
Isso é melhor para codificar objetos JSON e publicá-los.
Alex W
Não se a string contiver caracteres 'ou "
Jkarttunen
47

Use a escapefunção de querystring. Ele gera uma string segura de 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
fonte
1
Definitivamente, parece ser a função correta; querystring.stringify()(na resposta de Nicolas) parecem retornar uma string vazia agora.
Brandoncript
4
nodejs.org/api/… diz: "O querystring.escape()método é usado querystring.stringify()e geralmente não se espera que seja usado diretamente."
Simon Hänisch 18/08/19
17

Observe que a codificação URI é boa para a parte da consulta, não é boa para o domínio. O domínio é codificado usando o punycode. Você precisa de uma biblioteca como o URI.js para converter entre um URI e um IRI (Internationalized Resource Identifier).

Isso está correto se você planeja usar a sequência posteriormente como uma sequência de consulta:

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

Se você não deseja caracteres ASCII como /, :e ?deve ser escapado, use encodeURI:

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

No entanto, para outros casos de uso, você pode precisar de 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
fonte
12

encodeURIComponent (string) fará isso:

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

Passar o SQL por uma sequência de consultas pode não ser um bom plano,

veja este

John Culviner
fonte