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.


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()')

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()'

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'

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'

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.