Wie codiere ich etwas in Node.js?

314

Ich möchte dies per URL verschlüsseln:

SELECT name FROM user WHERE uid = me() 

Muss ich dafür ein Modul herunterladen? Ich habe bereits das Anforderungsmodul.

TIMEX
quelle
8
Dies ist in der Tat eine rutschige Straße und sollte unter allen Umständen vermieden werden.
Alfred
19
Versuchen Sie, eine SQL-Anweisung in Ihre URL aufzunehmen? Achten Sie auf den SQL Injection Attack ! Es ist im Allgemeinen eine schlechte Idee, SQL den Benutzern zugänglich zu machen. Es ist wirklich gefährlich.
Leonmax
4
@LightnessRacesinOrbit: sieht aus wie eine FQL-Abfrage.
Nikc.org
2
@ Demi: Nein? Wie würde das funktionieren? DBMS-Berechtigungen sind nicht ausreichend detailliert, selbst wenn jeder einzelne SO-Benutzer ein eigenes DB-Konto hat. Sagen Sie mir, wo auf SO SQL-Abfragen direkt übergeben werden? Die einzige Ausnahme ist der Datenexplorer, aber das sind alles schreibgeschützte Ansichten, und er wird sicherlich nicht in die URL eingefügt.
Leichtigkeitsrennen im Orbit
17
Der Typ könnte ein SQL-Validierungstool erstellen, nichts Falsches daran, SQL-Befehle in einem solchen Beispiel zu übergeben. Zu viel Fokus darauf, die Frage nicht zu beantworten oder gute Ratschläge zu geben (der am besten bewertete Kommentar gibt keine guten Ratschläge, macht sich nur über das OP lustig)
Rafael Eyng

Antworten:

597

Sie können JavaScript verwenden encodeURIComponent:

encodeURIComponent('select * from table where i()')
Joe
quelle
31
Um Besuchern eine Suche zu ersparen, dekodierendecodeURIComponent Sie den codierten URI. Bitte.
KyleFarris
125

Das eingebaute Modul querystringist genau das, wonach Sie suchen:

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
quelle
4
In diesem Fall können wir nur eine Map übergeben, keine Zeichenfolge. Wenn also arg eine Zeichenfolge ist, wird im Ergebnis nichts angezeigt. Wenn Sie also Zeichenfolgen zum Codieren haben, verwenden Sie encodeURIComponent ().
Ankit Patial
1
Dies ist besser zum Codieren und POSTEN von JSON-Objekten.
Alex W
Nicht, wenn die Zeichenfolge 'oder "Zeichen enthält
Jkarttunen
47

Verwenden Sie die escapeFunktion von querystring. Es wird eine URL-sichere Zeichenfolge generiert.

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
quelle
1
Dies scheint definitiv die richtige Funktion zu sein; querystring.stringify()(in Nicolas 'Antwort) scheinen jetzt eine leere Zeichenfolge zurückzugeben.
Brandonscript
4
nodejs.org/api/… sagt: "Die querystring.escape()Methode wird von verwendet querystring.stringify()und wird im Allgemeinen nicht direkt verwendet."
Simon Hänisch
17

Beachten Sie, dass die URI-Codierung für den Abfrageteil gut ist, nicht für die Domäne. Die Domain wird mit Punycode verschlüsselt. Sie benötigen eine Bibliothek wie URI.js , um zwischen einem URI und einem IRI (Internationalized Resource Identifier) ​​zu konvertieren.

Dies ist richtig, wenn Sie die Zeichenfolge später als Abfragezeichenfolge verwenden möchten:

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

Wenn Sie ASCII - Zeichen nicht mögen wollen /, :und ?zu entkommen werden, verwenden Sie encodeURIstattdessen:

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

Für andere Anwendungsfälle benötigen Sie möglicherweise stattdessen 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
quelle
12

encodeURIComponent (string) erledigt dies:

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

Das Weitergeben von SQL in einer Abfragezeichenfolge ist jedoch möglicherweise kein guter Plan.

siehe diesen

John Culviner
quelle