Wir haben eine Legacy-App, die keine Abfragen mit Positionsparametern durchführt, und überall gibt es SQL. Es wurde entschieden (bevor ich hier anfing), dass, da Benutzereingaben Apostrophe enthalten können, jede Zeichenketteneingabe für diese Apostrophe manuell maskiert werden sollte.
Hier ist der wesentliche Originalcode (nicht von mir geschrieben), der zur leichteren Verwendung in C # übersetzt wurde:
%Vor% Das scheint wirklich so zu sein, dass es irgendwie kaputt gehen kann, aber ich weiß nicht, wie es durch Benutzereingaben ausgenutzt werden könnte. Nehmen wir an, dass die Benutzereingabe ungefiltert ist, bis sie _IsValidLogin
erreicht, und vergessen Sie, dass Passwörter scheinbar im Nur-Text-Format gespeichert sind.
Die Lösung, um es für gut zu halten, ist offensichtlich - verwenden Sie Positionsparameter - aber ich brauche etwas Munition, um dem Management zu zeigen, warum / wie dieser Code unsicher ist, so dass Zeit / $ zugewiesen werden kann, um behoben zu werden / p>
Hinweis: Ich nehme an, dass dies möglich ist, aber das ist möglicherweise nicht der Fall. Ich bin kein SQL-Superstar.
Hinweis 2: Ich habe diese Frage als datenbankunabhängig geäußert, aber wenn Sie diesen Code für eine bestimmte Engine ausnutzen können, begrüße ich Ihren Beitrag.
Nun, ich kann nicht sehen, wie verletzlich es ist. Also, lasst uns einen anderen Grund diskutieren, warum es geändert werden sollte - es ist ziemlich ineffektiv. In MSSQL (und ich denke, die meisten anderen High-End-SQL-Server) werden Abfragen analysiert, und ein Ausführungsplan wird erstellt, und dann werden die Abfrage und der Plan gespeichert. Wenn eine exact
-Kopie der Abfrage erneut angefordert wird, wird der gespeicherte Ausführungsplan verwendet. Parameter haben keinen Einfluss darauf, wenn Sie Parameter verwenden, werden die Pläne wiederverwendet. Wenn Sie den Text einbetten, wird es nie.
Tags und Links sql database sql-injection database-agnostic