SQL-Injection ist ein sehr schwerwiegendes Sicherheitsproblem, zum großen Teil, weil es so einfach ist, es falsch zu machen: Die offensichtliche, intuitive Art, eine Abfrage mit Benutzereingaben zu erstellen, macht Sie anfällig, und die richtige Art, dies zu verringern, erfordert, dass Sie über Parameter informiert sind Abfragen und SQL-Injection zuerst.
Mir scheint, dass der offensichtliche Weg, dies zu beheben, darin besteht, die offensichtliche (aber falsche) Option auszuschalten: Korrigieren Sie das Datenbankmodul, sodass jede Abfrage, die hartcodierte Werte in der WHERE-Klausel anstelle von Parametern verwendet, eine nette, beschreibende zurückgibt Fehlermeldung, die Sie auffordert, stattdessen Parameter zu verwenden. Dies würde natürlich eine Deaktivierungsoption erfordern, damit Dinge wie Ad-hoc-Abfragen von Verwaltungstools weiterhin problemlos ausgeführt werden können, sie sollte jedoch standardmäßig aktiviert sein.
Wenn dies der Fall wäre, würde die SQL-Injection fast über Nacht heruntergefahren, aber meines Wissens macht dies kein RDBMS. Gibt es einen guten Grund, warum nicht?
SELECT * FROM jokes WHERE date > DATE_SUB(NOW(), INTERVAL 1 DAY) ORDER BY score DESC;
"bad"
wirklich ein Literal ist oder aus der Verkettung von Zeichenfolgen resultiert. Die beiden Lösungen, die ich sehe, sind, entweder SQL und andere in Strings eingebettete DSLs zu entfernen (ja, bitte) oder Sprachen zu fördern, bei denen die Verkettung von Strings ärgerlicher ist als die Verwendung parametrisierter Abfragen (umm, nein).
bad_ideas_sql = 'SELECT title FROM idea WHERE idea.status == "bad" AND idea.user == :mwheeler'
Hätte in einer einzigen Abfrage sowohl fest codierte als auch parametrisierte Werte - versuchen Sie das zu fangen! Ich denke, es gibt gültige Anwendungsfälle für solche gemischten Abfragen.