Warum hat der Schutz vor SQL-Injection keine hohe Priorität?

39

Beim Stack Overflow sehe ich eine Menge PHP-Code in Fragen und Antworten, die MySQL-Abfragen enthalten, die für SQL-Injection-Angriffe sehr anfällig sind, obwohl grundlegende Problemumgehungen seit mehr als einem Jahrzehnt weit verbreitet sind.

Gibt es einen Grund, warum diese Arten von Code-Snippets heute noch verwendet werden?

Leichtigkeit Rennen mit Monica
quelle
37
Schuld daran sind schlecht geschriebene Online-Tutorials. Meistens kopieren und fügen die Benutzer nur den Code ein, den sie im Internet finden. JavaScript ist auch ein weiteres Opfer dieser Praxis.
KJYe.Name
34
Beschuldige die Blogs. Oh, und W3Schools ...
Brian Driscoll
13
Ja, absolut W3Schools - siehe w3fools.com
DisgruntledGoat
2
Ich sehe ständig Leute, die vor der SQL-Injektion warnen - daher glaube ich nicht einmal, dass die Prämisse dieser Frage zutrifft. Es hat eine hohe Priorität.
GroßmeisterB
3
Was ich in vielen Antworten sehe, ist, dass es einfacher ist, kritisch defektes PHP zu lehren, als es zu lehren, naja, PHP, das nicht kritisch defekt ist. Sie können dieses Argument nicht akzeptieren und behaupten dennoch, dass PHP keine schlechte Sprache ist
user16764

Antworten:

34

Ich denke, es liegt hauptsächlich an a) Unwissenheit b) Faulheit. Anfänger wissen normalerweise nicht viel über SQL Injection, und selbst wenn sie davon hören, ignorieren sie es, weil es so viel einfacher und einfacher ist, auf diese Weise zu programmieren.

froadie
quelle
8
Ich habe versucht, solche Dinge anderswo zu korrigieren, nur um zu erfahren, dass sie für das vorliegende Problem nicht relevant sind. Da viele Leute einen einfachen Hack einer etwas komplexeren guten Lösung vorziehen, bleiben schlechte Beispiele in Ruhe.
15.
6
Die meisten Leute interessieren sich nicht wirklich für SQL-Injection, bis sie davon betroffen sind. Dann fragen sie sich plötzlich, wohin ihre Tische gingen.
Joel Etherton
1
Der andere Grund ist, dass die SQL-Injection nicht immer als relevant für interne Apps angesehen wird. (Nicht, dass sie Recht haben.)
John Fisher
1
Vergessen Sie nicht, dass Antworten zur Beantwortung der Frage dienen. Oft ist es Pseudo-Code (oder SQL), der die Frage beantworten soll, und nicht unbedingt eine sichere Lösung zum Kopieren und Einfügen (ungeachtet dessen, wie die Antwort in der Realität verwendet werden kann).
Dalin Seivewright
1
@ l0b0 Ich kenne jemanden, der Leute dazu gebracht hat, SQL-Injection-Fixes ernst zu nehmen, indem er tatsächlich einen SQL-Injection-Angriff gegen den aktuellen Produktionscode demonstriert.
User16764
26

Mit PHP ist es für Leute, die nur sehr wenig wissen, sehr, sehr einfach, nützliche dynamische Webseiten zu erstellen. Dies bedeutet, dass PHP viele Anfänger anzieht, die etwas Nützliches erstellen, aus anderen nützlichen Beispielen lernen und sich umdrehen, um anderen beizubringen, wie man diese coole, nützliche Sache macht. Das Ergebnis ist eine Menge schlechter Code und eine Menge Programmierer, die es nicht besser wissen.

Es macht die Sache nur noch schlimmer, dass ein großer Teil der kompetenten Programmierer nichts mit PHP zu tun haben möchte. Dies reduziert die Basis erfahrener Leute, die bereit sind, andere besser zu unterrichten. Aber warum vermeiden sie PHP? Gut für eine Kombination von Faktoren. Zum Teil mögen sie es nicht, mit den Sprachwarzen umzugehen. Zum Teil liegt es daran, dass sie es vorziehen, mit gutem Code zu arbeiten, und es gibt nicht viele gute PHP-Programme.

Diese exakte Konstellation von Problemen verursachte Perl. Als leuchtendes Beispiel sei der Fall von Matt Wright genannt, einem begeisterten Teenager, der bereits in den 90er Jahren viele nützliche, gut dokumentierte und einfach zu installierende CGI-Skripte zur Verfügung stellte. Leider verstand er nichts von Sicherheit und die Leute, die seine Sachen benutzen wollten, auch nicht. Das Ergebnis war das Matt Wright Script Archives, das eine endlose Reihe von Sicherheitsproblemen für frühe CGI-Skripte darstellte. Trotz Bemühungen wie http://www.scriptarchive.com/nms.html verbesserte sich das Problem für Perl erst, als Shared Hosting-Anbieter PHP komfortabler machten als alles andere. Dies führte zu dem Problem, von Perl auf PHP umzusteigen.

btilly
quelle
Wie Sie sagten, ist das Problem nicht Perl oder PHP, sondern dass diese Sprachen Anfängern viele Dinge erlauben, was gut ist, aber nicht immer Möglichkeiten bietet, sie gut zu machen, die so offensichtlich sind.
Zachary K
2
@ ZacharyK: Ist das nicht standardmäßig die Schuld der Sprache?
Leichtigkeit Rennen mit Monica
6
@ tomalak-geretkal: Du benutzt das Wort "Fehler", als ob es eine schlechte Sache wäre, Dinge zu erledigen. Die gleichen Eigenschaften, die zu viel schlechtem Code führen, führen auch zu vielen echten, gelösten Problemen. Es ist nicht klar, dass dies insgesamt eine schlechte Sache ist.
btilly
Zu "Fehler": Wenn HTML (oder besser gesagt die Browser, die es interpretieren) so fehlertolerant wie XSL gewesen wäre, hätte es niemals ein World Wide Web gegeben ...
Benjol
8

Leider gibt es Unmengen von mehr als schlechten PHP-Tutorials, und einige ältere PHP-Bücher haben es ebenfalls vermasselt, die Leute anzuweisen, richtigen Code zu schreiben (ohne register_globals usw.).

magic_quotes_gpcDa es in der Vergangenheit aktiviert wurde , war es den Leuten außerdem egal, ob sie entkommen konnten, weil "es einfach funktionierte".

Diebesmeister
quelle
4

Persönlich glaube ich, dass PHP einfach zu bedienen ist, also ist es natürlich leicht zu missbrauchen.

Davidhaskins
quelle
2

Als Mensch und Programmierer fällt es mir bemerkenswert leicht, Fehler zu machen und bestimmte Dinge zu übersehen, besonders wenn ich unter Zeitdruck stehe.

Es ist leicht und vielleicht zu verlockend, eine bestimmte Sprache dafür verantwortlich zu machen, dass sie zu leicht zugänglich ist. Aber das würde das größere Problem der menschlichen Fehlbarkeit beschönigen, unabhängig von der Sprache, in der programmiert wird.

Zugegeben, wir haben seit der Assemblersprache einen langen Weg zurückgelegt, und ich denke, dass ich in einer moderneren Sprache wie PHP, Python, Ruby oder Java viel produktiver programmieren würde.

Tatsächlich haben PHP (und andere Skriptsprachen) die Eintrittsbarriere gesenkt. Das könnte bedeuten, dass immer mehr Programmieranfänger zuerst PHP ausprobieren. Das bedeutet aber sicherlich nicht, dass alle PHP-Programmierer weniger qualifiziert sind oder weniger in der Lage sind, aus ihren Fehlern zu lernen als Programmierer anderer Sprachen.

Rasmus Lerdorf hat PHP bereits 1994 in seiner ursprünglichen Form entwickelt und sich seitdem erheblich weiterentwickelt. In seiner modernsten Version unterstützt es objektorientierte Programmierung sowie hervorragende Frameworks wie Symfony. PHP als Sprache hat sich von seinen ursprünglichen Einschränkungen gelöst und bietet nun eine große Flexibilität bei der Wahl der Programmiersprache. Sie können damit ein Skript mit 9.000 Zeilen Spaghetti-Code erstellen oder es im Kontext eines modernen MVC-Frameworks wie Symfony verwenden: Sie haben die Wahl!

Ich bin der festen Überzeugung, dass Sicherheitslücken nicht auf eine einzige Sprache beschränkt sind. Es ist verlockend, alle PHP-Programmierer als weniger fähig oder anfälliger für das Schreiben von unsicherem Code abzuschreiben. Aber ich frage mich, wie viel davon sprachliche Voreingenommenheit ist und wie viel davon Tatsache?

Jay Sheth
quelle
Ich habe nichts über "alle PHP-Programmierer" gesagt.
Leichtigkeit Rennen mit Monica
2

Ich denke, ein Teil des Problems sind Leute, die einfach Code kopieren, ohne sich die Mühe machen zu lernen, was sie tun, aber meiner Meinung nach ist die Art und Weise, wie wir Porgamnming unterrichten, kaputt und es ist einer der Gründe, warum es so viel schlechten Code gibt. Wir unterrichten Syntax außerhalb des Kontexts, sodass Anfänger nicht wissen, wann sie etwas verwenden und wann nicht oder welche Probleme die Syntax lösen soll und welche Probleme sie nicht lösen soll. SO benutzen sie einen Hammer, wenn ein Schlüssel das bessere Werkzeug gewesen wäre.

Anstatt also nur Syntax zu unterrichten, organisieren Sie den Kurs wie folgt:

  1. So richten Sie eine einfache Webseite ein
  2. Auf diese Weise veranlassen Sie die Webseite, Daten aus einer Datenbank abzurufen
  3. So senden Sie Daten von einer Webseite an eine Datenbank
  4. So stellen Sie sicher, dass die richtigen Daten gesendet werden.
  5. So schützen Sie Ihre Datenbank vor böswilliger Dateneingabe
HLGEM
quelle
das ist mehr oder weniger die art und weise, in der mir php +1 beigebracht wurde
Rémi
1

Ich denke, Sie werden eine ähnliche Menge an MS SQL + ASP / ASP.NET-Beispielen finden, die genauso anfällig sind.

Ich glaube, das Problem rührt teilweise von der Tatsache her, dass Sie, wenn Sie versuchen, etwas zu lehren, z. B. Daten mit einer WHERE-Klausel zu filtern, Ihr Beispiel wirklich nicht überladen möchten, indem Sie Ihre Abfragezeichenfolge ordnungsgemäß maskieren oder einen parametrisierten Befehl verwenden.

Ich bilde seit vielen Jahren Entwickler aus und kann mich in Leute einfühlen, die schrecklichen Code in Tutorials schreiben. Manchmal ist das am einfachsten zu verstehen. Nebenbei weise ich jedoch immer auf anfälligen Code hin und mache ihn zu einem interessanten Nebenthema.

Fung
quelle
6
Das sollte keine Seite sein. Das sollte Teil der Grundstunde sein. Möglicherweise mit einer großen, fetten Warnung vor der falschen Vorgehensweise. Die Leute neigen dazu, auszuschneiden und einzufügen, was sie zuerst sehen, und Sie möchten wirklich, dass dies der richtige Weg ist, um Dinge zu tun.
Mittwoch,
Sicherlich ist die Parametrisierung in der .NET-Welt heutzutage ziemlich unkompliziert und sollte in der Tat "Seite eins" sein.
Alan B
1

Der ursprüngliche Autor von PHP, Rasmus Lerdorf , befürwortet in seinem berüchtigten Blogeintrag die "No-Framework" -Entwicklung. Obwohl er für SQL-Abfragen PDO verwendet, besteht kein Risiko einer SQL-Injection. Immer noch ziemlich hässlich und veraltet im Vergleich zu modernen MVC-Frameworks mit ORM-Ebenen.

vartec
quelle
5
Es ist sicherlich möglich, Websites mit komplexen Frameworks zu überentwickeln, die Sie einfach nicht benötigen. Ich würde sagen, dass Rasmus 'Vorschläge an die kriminelle Gefahr heranreichen, aber es gibt definitiv einen vernünftigen Mittelweg.
Leichtigkeit Rennen mit Monica
Heutzutage ist die Verwendung von ORM keine Überentwicklung. es ist standard. Verwenden Sie also MVC-Muster.
Vartec
3
@vartec: Es ist kaum „Standard“ , nur weil alle Schafe es verwenden (und für das, was es wert ist , nicht einmal alle die Schafe sind es verwendet wird ). Bei kleinen Skripten kann es leicht zu Überentwicklungen kommen.
Leichtigkeit Rennen mit Monica
1
@Tomalak: Es ist Standard, denn so können saubere und nachhaltige Projekte umgesetzt werden. "kleine Skripte" neigen dazu, im Laufe der Zeit zu wachsen und sich in unhaltbare Monstrositäten zu verwandeln.
Vartec
2
@vartec: Ich denke, du hast die Bedeutung von "Standard" falsch verstanden.
Leichtigkeit Rennen mit Monica
1

Sie können PHP selbst die Schuld an dieser schlechten Praxis geben. Ältere PHP-Versionen (bis ca. 2006) würden alle GET- und POST-Eingabevariablen umgehen, damit sie für die Datenbankabfrageinterpolation BY DEFAULT geeignet sind. Siehe http://php.net/manual/en/security.magicquotes.php

Ben XO
quelle
2
Es gab eine Zeit, alle Variablen entkommen würde , als ob sie in MySQL speziell gingen, ob sie jemals waren oder nicht . Hinweis für Sprachdesigner: Wenn Sie feststellen, dass Sie implementieren müssen stripslashes(), haben Sie es bereits falsch gemacht.
Dan Ray
0

Verwechseln Sie nicht den Zweck eines Tutorials, das einfach etwas demonstrieren soll, mit dem, was in einer Produktionsumgebung getan werden sollte. Zum Beispiel hat der meiste Tutorial-Code, den ich geschrieben habe, wenig oder keine Fehler- / Ausnahmekontrolle. Ich versuche den Leser daran zu erinnern, dass der Code nur zeigt, wie man eine bestimmte Aufgabe ausführt, nicht wie man alle möglichen Ergebnisse abdeckt.

SnoopDougieDoug
quelle
3
Entschuldigung, aber absolut kein Beispielcode sollte jemals mySQL-Abfragen mit PHP mischen. Das macht man einfach falsch.
Raynos
1
Und verantwortungslos.
Leichtigkeit Rennen mit Monica
-1 für most tutorial code I have written has little or no error/exception checking..
Yannis
Ich kann den Punkt des OP sehen. Verantwortungslos ist es, wenn ein Arbeitgeber einen Mann anstellt, dem Kenntnisse über SQL-Injection und dergleichen fehlen.
Raffael
Ich halte diesen Ansatz für vertretbar, wenn Sie Kommentare direkt in den Code mit der Aufschrift "Verwenden Sie dies nicht in der Produktion!" Einfügen. Auf diese Weise haben die Kopierer keine Entschuldigung.
Benjol
-1

Als ich PHP lernte, habe ich mir einige dieser PHP + MySQL-Bücher angesehen, und ja, ich habe das Gefühl, dass es zu dieser schlechten Praxis beiträgt. Aber ich habe Sympathie, weil sie die Sprache unterrichten , nicht gute Programmierpraktiken. Wo würde es sonst enden?

Steve Rathbone
quelle
2
Wenn Sie die Sprache unterrichten, sollten Sie jedoch weiterhin die bevorzugten APIs in Ihren Beispielen verwenden. Verwenden Sie wie immer die parametrische Form von SQL-Abfragen, möglicherweise mit einer Fußnote wie "Denken Sie nie daran, SQL mithilfe von Interpolation zu erstellen. Es scheint ein wenig einfacher zu sein, ist aber äußerst anfällig für Sicherheitslücken."
Jan Hudec
Ja, gute Punkte. Fußnoten sind eine gute Erinnerung, und das gilt auch für die Online-Tutorials. Im Ernst, es wäre großartig, wenn Buchautoren aller Sprachen den Rat von OWASP in Anfängertexte integrieren könnten. Auch nur als Referenz. Die OWASP Foundation leistet gute Arbeit.
Steve Rathbone
@indifferentDrum: Sie können den Leuten beibringen, auch mit den Füßen zu fahren - das bedeutet nicht, dass es eine gute Idee ist.
Leichtigkeit Rennen mit Monica