¿Cómo puedo codificar algo en Node.js?

314

Quiero codificar URL esto:

SELECT name FROM user WHERE uid = me() 

¿Tengo que descargar un módulo para esto? Ya tengo el módulo de solicitud.

TIMEX
fuente
8
De hecho, este es un camino resbaladizo y debe evitarse a toda costa.
Alfred
19
¿Estás tratando de poner una declaración SQL en tu url? ¡tenga cuidado con el ataque de inyección SQL ! Generalmente es una mala idea exponer SQL a los usuarios, es realmente peligroso.
Leonmax
44
@LightnessRacesinOrbit: parece una consulta FQL.
nikc.org
2
@Demi: ¿No? ¿Cómo funcionaría eso? Los permisos de DBMS no son lo suficientemente precisos, incluso si cada usuario de SO tiene su propia cuenta de DB. ¿Dime dónde en SO ves las consultas SQL pasadas directamente? La única excepción es el explorador de datos, pero son todas las vistas de solo lectura, y ciertamente no se incluyen en la URL.
Carreras de ligereza en órbita
17
El tipo podría estar construyendo una herramienta de validación de SQL, nada de malo con pasar comandos SQL en un ejemplo como ese. Demasiado enfoque en no responder la pregunta ni dar buenos consejos (el comentario más votado no da buenos consejos, solo se burla del OP)
Rafael Eyng

Respuestas:

598

Puedes usar JavaScript encodeURIComponent:

encodeURIComponent('select * from table where i()')
Joe
fuente
31
Para guardar una búsqueda de visitantes, sí ... decodeURIComponentes cómo decodifica el URI codificado. De nada.
KyleFarris
125

El módulo incorporado querystringes lo que estás buscando:

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
fuente
44
en este caso solo podemos pasar un mapa, no una cadena, por lo que si arg es una cadena, no verá nada en el resultado. Entonces, si tiene cadenas para codificar, use encodeURIComponent ().
Ankit Patial
1
Esto es mejor para codificar objetos JSON y publicarlos.
Alex W
No si la cadena contiene "o" personajes
Jkarttunen
47

Use la escapefunción de querystring. Genera una cadena 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
fuente
1
Esto definitivamente parece ser la función correcta; querystring.stringify()(en la respuesta de Nicolas) parece que ahora devuelve una cadena vacía.
brandonscript
44
nodejs.org/api/… dice: "El querystring.escape()método es usado por querystring.stringify()y generalmente no se espera que se use directamente".
Simon Hänisch
17

Tenga en cuenta que la codificación URI es buena para la parte de consulta, no es buena para el dominio. El dominio se codifica utilizando punycode. Necesita una biblioteca como URI.js para convertir entre un URI e IRI (Identificador Internacionalizado de Recursos).

Esto es correcto si planea usar la cadena más tarde como una cadena 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'

Si no desea que los caracteres ASCII les gusta /, :y ?que se escaparon, utilice encodeURIen su lugar:

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

Sin embargo, para otros casos de uso, es posible que necesite uri-js en su lugar:

> 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
fuente
12

encodeURIComponent (string) lo hará:

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

Sin embargo, pasar SQL en una cadena de consulta podría no ser un buen plan,

mira este

John Culviner
fuente