Ist es möglich, SQL-Injektionen in Node.js (vorzugsweise mit einem Modul) auf dieselbe Weise zu verhindern, wie PHP vorbereitete Anweisungen hatte, die gegen sie geschützt waren?
Wenn das so ist, wie? Wenn nicht, welche Beispiele könnten den von mir bereitgestellten Code umgehen (siehe unten).
Einige Zusammenhänge:
Ich mache eine Webanwendung mit einem Back-End-Stack, der aus Node.js + MySql besteht, unter Verwendung des Node-Mysql- Moduls. Unter dem Gesichtspunkt der Benutzerfreundlichkeit ist das Modul großartig, aber es hat noch nichts Ähnliches wie die Prepared Statements von PHP implementiert (obwohl mir bewusst ist, dass es sich um eine Aufgabe handelt ).
Nach meinem Verständnis hat die Implementierung vorbereiteter Anweisungen durch PHP unter anderem wesentlich zur Verhinderung von SQL-Injektionen beigetragen . Ich mache mir jedoch Sorgen, dass meine node.js-App ähnlichen Angriffen ausgesetzt sein könnte, selbst wenn die Zeichenfolge standardmäßig maskiert ist (wie im folgenden Code-Snippet).
node-mysql scheint der beliebteste mysql-Connector für node.js zu sein, daher habe ich mich gefragt, was andere Leute (wenn überhaupt) tun könnten, um dieses Problem zu erklären - oder ob es überhaupt ein Problem mit node.js ist (Ich bin mir nicht sicher, wie das nicht wäre, da benutzer- / clientseitige Eingaben beteiligt sind.)
Sollte ich vorerst zu node-mysql-native wechseln , da es vorbereitete Anweisungen enthält? Ich zögere, dies zu tun, da es nicht so aktiv zu sein scheint wie Node-MySQL (obwohl dies nur bedeuten kann, dass es vollständig ist).
Hier ist ein Ausschnitt aus dem Benutzerregistrierungscode, der das Desinfektionsmodul zusammen mit der vorbereiteten anweisungsähnlichen Syntax von node-mysql verwendet (die, wie oben erwähnt, das Entweichen von Zeichen bewirkt), um Cross-Site-Scripting bzw. SQL-Injektionen zu verhindern:
// Prevent xss
var clean_user = sanitizer.sanitize(username);
// assume password is hashed already
var post = {Username: clean_user, Password: hash};
// This just uses connection.escape() underneath
var query = connection.query('INSERT INTO users SET ?', post,
function(err, results)
{
// Can a Sql injection happen here?
});