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?
});
quelle
Die Bibliothek hat einen Abschnitt in der Readme-Datei über das Entkommen. Es ist Javascript-native, daher empfehle ich nicht, zu Node-MySQL-native zu wechseln . In der Dokumentation sind folgende Richtlinien für die Flucht aufgeführt:
Bearbeiten: node-mysql-native ist auch eine reine Javascript-Lösung.
true
/false
strings konvertiertYYYY-mm-dd HH:ii:ss
Zeichenfolgen konvertiertX'0fa5'
['a', 'b']
in'a', 'b'
[['a', 'b'], ['c', 'd']]
in('a', 'b'), ('c', 'd')
key = 'val'
Paaren. Verschachtelte Objekte werden in Zeichenfolgen umgewandelt.undefined
Ich werdenull
konvertiert zuNULL
NaN
Ich werde wieInfinity
es ist belassen. MySQL unterstützt diese nicht und der Versuch, sie als Werte einzufügen, löst MySQL-Fehler aus, bis sie die Unterstützung implementieren.Auf diese Weise können Sie Folgendes tun:
So gut wie das:
Neben diesen Funktionen können Sie auch die Escape-Funktionen verwenden:
So entgehen Sie Abfragekennungen:
Und als Antwort auf Ihren Kommentar zu vorbereiteten Aussagen:
Die vorbereiteten Anweisungen befinden sich in der Aufgabenliste für diesen Connector, aber in diesem Modul können Sie zumindest benutzerdefinierte Formate angeben, die vorbereiteten Anweisungen sehr ähnlich sein können. Hier ist ein Beispiel aus der Readme-Datei:
Dadurch wird das Abfrageformat der Verbindung geändert, sodass Sie folgende Abfragen verwenden können:
quelle
Mir ist klar, dass dies ein älterer Beitrag ist, aber es scheint, dass eine Antwort nie markiert wurde, also werde ich dies hier rauswerfen.
In Bezug auf das Testen, ob ein von Ihnen verwendetes Modul sicher ist oder nicht, können Sie mehrere Wege einschlagen. Ich werde auf die Vor- und Nachteile jedes einzelnen eingehen, damit Sie eine fundiertere Entscheidung treffen können.
Derzeit gibt es keine Sicherheitslücken für das von Ihnen verwendete Modul. Dies kann jedoch häufig zu einem falschen Sicherheitsgefühl führen, da möglicherweise eine Sicherheitslücke vorliegt, die das von Ihnen verwendete Modul / Softwarepaket ausnutzt, und Sie nicht benachrichtigt werden auf ein Problem, bis der Anbieter einen Fix / Patch anwendet.
Um über Sicherheitslücken auf dem Laufenden zu bleiben, müssen Sie Mailinglisten, Foren, IRC und anderen Diskussionen zum Thema Hacking folgen. PRO: Oft werden Sie auf potenzielle Probleme in einer Bibliothek aufmerksam, bevor ein Anbieter benachrichtigt wurde oder einen Fix / Patch herausgegeben hat, um den potenziellen Angriffsweg auf seine Software zu beheben. CON: Dies kann sehr zeitaufwändig und ressourcenintensiv sein. Wenn Sie diesen Weg gehen, können ein Bot, der RSS-Feeds verwendet, eine Protokollanalyse (IRC-Chat-Protokolle) und ein Web-Scrapper mithilfe von Schlüsselphrasen (in diesem Fall Node-MySQL-Native) und Benachrichtigungen dazu beitragen, den Zeitaufwand für das Durchsuchen dieser Ressourcen zu verringern.
Erstellen Sie einen Fuzzer, verwenden Sie einen Fuzzer oder ein anderes Schwachstellen-Framework wie Metasploit , SQLMap usw., um Probleme zu testen, nach denen der Anbieter möglicherweise nicht gesucht hat. PRO: Dies kann sich als sichere Methode erweisen, um auf einem akzeptablen Niveau sicherzustellen, ob das von Ihnen implementierte Modul / die Software für den öffentlichen Zugriff sicher ist oder nicht. CON: Dies wird auch zeitaufwändig und kostspielig. Das andere Problem ergibt sich aus falsch positiven Ergebnissen sowie einer ungebildeten Überprüfung der Ergebnisse, bei denen ein Problem vorliegt, aber nicht bemerkt wird.
Wirklich Sicherheit und Anwendungssicherheit im Allgemeinen können sehr zeitaufwändig und ressourcenintensiv sein. Eine Sache, die Manager immer verwenden, ist eine Formel, um die Kosteneffizienz (Arbeitskräfte, Ressourcen, Zeit, Bezahlung usw.) der Ausführung der beiden oben genannten Optionen zu bestimmen.
Wie auch immer, mir ist klar, dass dies keine Ja- oder Nein-Antwort ist, auf die man gehofft hat, aber ich glaube, niemand kann Ihnen das geben, bis er eine Analyse der betreffenden Software durchführt.
quelle
Ich weiß, dass diese Frage alt ist, aber für alle Interessierten ist MySQL-native veraltet, so dass es zu MySQL2 wurde , einem neuen Modul, das mit Hilfe des ursprünglichen MySQL- Modulteams erstellt wurde. Dieses Modul hat mehr Funktionen und ich denke, es hat das, was Sie wollen, da es Anweisungen (unter Verwendung von .execute ()) wie in PHP für mehr Sicherheit vorbereitet hat.
Es ist auch sehr aktiv (die letzte Änderung war von 2-1 Tagen). Ich habe es vorher nicht ausprobiert, aber ich denke, es ist das, was Sie wollen und mehr.
quelle
Am einfachsten ist es, alle Ihre Datenbankinteraktionen in einem eigenen Modul zu verarbeiten, das Sie in Ihre Routen exportieren. Wenn Ihre Route keinen Kontext der Datenbank hat, kann SQL sie sowieso nicht berühren.
quelle