Comment puis-je encoder quelque chose URl dans Node.js?

314

Je veux encoder cette URL:

SELECT name FROM user WHERE uid = me() 

Dois-je télécharger un module pour cela? J'ai déjà le module de demande.

TIMEX
la source
8
En effet, c'est une route glissante et doit être évitée à tout prix.
Alfred
19
Essayez-vous de mettre une instruction SQL dans votre URL ??? attention à l' attaque par injection SQL ! C'est généralement une mauvaise idée d'exposer SQL aux utilisateurs, c'est vraiment dangereux.
Leonmax
4
@LightnessRacesinOrbit: ressemble à une requête FQL.
nikc.org
2
@Demi: Non? Comment cela fonctionnerait-il. Les autorisations SGBD ne sont pas suffisamment précises, même si chaque utilisateur SO a son propre compte DB. Dites-moi où SO vous voyez les requêtes SQL passées directement? La seule exception est l'explorateur de données, mais ce sont toutes des vues en lecture seule, et ce n'est certainement pas mis dans l'URL.
Courses de légèreté en orbite le
17
Le gars pourrait construire un outil de validation SQL, rien de mal à passer des commandes SQL dans un exemple comme ça. Trop d'attention à ne pas répondre à la question ni à donner de bons conseils (le commentaire le plus voté ne donne pas de bons conseils, ne fait que se moquer de l'OP)
Rafael Eyng

Réponses:

598

Vous pouvez utiliser JavaScript encodeURIComponent:

encodeURIComponent('select * from table where i()')
Joe
la source
31
Pour sauver les visiteurs d'une recherche, oui ... decodeURIComponentc'est ainsi que vous décodez l'URI codé. De rien.
KyleFarris
125

Le module intégré querystringest ce que vous recherchez:

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
la source
4
dans ce cas, nous ne pouvons transmettre qu'une carte et non une chaîne, donc si arg est une chaîne, vous ne verrez rien en résultat. Donc, si vous avez des chaînes à encoder, utilisez encodeURIComponent ().
Ankit Patial
1
C'est mieux pour encoder des objets JSON et les POSTER.
Alex W
Pas si la chaîne contient des caractères 'ou "
Jkarttunen
47

Utilisez la escapefonction de querystring. Il génère une chaîne sécurisée 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
la source
1
Cela semble définitivement être la fonction correcte; querystring.stringify()(dans la réponse de Nicolas) semble renvoyer une chaîne vide maintenant.
brandonscript
4
nodejs.org/api/… dit: "La querystring.escape()méthode est utilisée par querystring.stringify()et ne devrait généralement pas être utilisée directement."
Simon Hänisch
17

Notez que le codage URI est bon pour la partie requête, ce n'est pas bon pour le domaine. Le domaine est codé à l'aide de punycode. Vous avez besoin d'une bibliothèque comme URI.js pour convertir entre un URI et IRI (Internationalized Resource Identifier).

Ceci est correct si vous prévoyez d'utiliser la chaîne ultérieurement comme chaîne de requête:

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

Si vous ne voulez pas de caractères ASCII aiment /, :et ?à être échappés, utilisez à la encodeURIplace:

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

Cependant, pour d'autres cas d'utilisation, vous pourriez avoir besoin d' uri-js à la place:

> 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
la source
12

encodeURIComponent (string) le fera:

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

Passer SQL dans une chaîne de requête n'est peut-être pas un bon plan,

voir celui-ci

John Culviner
la source