Wie kann ich Programmierer dazu bringen, keinen Code mehr zu schreiben, der für SQL-Injection anfällig ist?

11

Manchmal ist man beschäftigt und delegiert kleine Aufgaben an Junior-Programmierer. Wenn Sie jedoch nicht genau genug aufpassen, finden Sie sich mit dieser Art von Code in der Produktion wieder:

class DivtoggleController extends Zend_Controller_Action {

    public function closeAction() {
        /* ... code removed for brevity ... */

        $req = $this->getRequest();
        $formData = $req->getPost();

        $d = $formData['div'];
        $i = $formData['id'];

        $dm = new Model_DivtoggleManager();
        $rs = $dm->setDivToggleById($d, $i);

    }

}


class Model_DivtoggleManager extends Zend_Db_Table {

    public function setDivToggleById($div, $id) {
        $result = $this->getAdapter()->query(
           "update div_toggle set " . $div . "=1 where id=" . $id
        );
    }

}

Wenn ich der Kürze halber die Authentifizierungs- / Sitzungsverwaltungslogik entfernt habe, wer kann mir dann sagen, welches mögliche Problem mit diesem Beispiel auftreten könnte?

Roger Halliburton
quelle
Warum wird dies nicht in einem einfachen Cookie gespeichert?
Darknight
1
@Darknight, Sie gehen davon aus, dass es eine Sitzung gibt, in der der Cookie gespeichert werden kann. Ob dies der Fall ist oder nicht, spielt für das größere Sicherheitsproblem keine Rolle.
Roger Halliburton

Antworten:

24

Du kannst sie unterrichten. Jeder tut dies am Anfang, auch Sie. Wenn diese Art von Code es in die Produktion schafft, ist es die Schuld der älteren Leute; nicht der Junior.

Bearbeiten:

Eines der Dinge, die ich getan habe, ist, dass ich persönlich Leute aktiv gebeten habe, meinen Code (einschließlich der Junioren) vor einer Veröffentlichung zu überprüfen. Der Code wird überprüft, die Junioren sehen darin eine Lernerfahrung, die Leute verlieren die Angst vor einer Codeüberprüfung als Strafe und beginnen, dasselbe zu tun.

John Kraft
quelle
2
+1 Muss zustimmen. Sie können einem (vermutlich) Junior-Programmierer keine Vorwürfe machen, weil Sie einen Wissensstand angenommen haben, den er möglicherweise nicht besitzt. (Das heißt, würden Sie gerne solche Probleme denken , sind in der heutigen Zeit gut bekannt Dann wieder, ich würde. Mögen denken , dass ich talentiert und gut aussehend, etc.) :-)
John Parker
Eine faire Aussage. Ich denke, ich sollte eine Folgefrage stellen, in der gefragt wird, warum das Management darauf bestehen würde, Code in die Produktion zu bringen, der von den erfahrenen Programmierern nicht genehmigt wurde. Riskiere ich meinen Job wegen eines kleinen Sicherheitsproblems?
Roger Halliburton
1
@Roger Halliburton: Na, wenn das Sicherheitsproblem nicht irgendwie ausgebeutet werden, was ist das Schlimmste, was passieren könnte? Und warum kostet es Sie Ihren Job, auf Sicherheitsprobleme hinzuweisen? Möchte das Management nicht, dass dies behandelt wird?
FrustratedWithFormsDesigner
1
@ Roger - es ist nur geringfügig, bis Sie gehackt werden. :) Ich denke, dass es ein Fehler ist, Code ohne Überprüfung in die Produktion zu bringen (unabhängig von der Ebene des Entwicklers). Leider ist dies in vielen Unternehmen sehr verbreitet. und ime, es dauert normalerweise eine große Zeit, bis das Management anfängt, Dinge wie Codeüberprüfungen zu bewerten.
John Kraft
1
@ Roger: Der gesamte Code sollte überprüft werden, nicht nur der von "Junior" -Programmierern geschriebene Code. Selbst erfahrene Programmierer machen Fehler.
Dean Harding
20

Hacken Sie ihren Code vor ihren Augen und zeigen Sie ihnen, wie sie ihn beheben können. Immer und immer wieder, bis sie verstehen.

Joe Phillips
quelle
4
Senden Sie ihnen jeden Morgen eine E-Mail: "Übrigens, ich habe Ihre Datenbank gestern Abend erneut über eine andere SQL-Injection-Schwachstelle gelöscht, die Sie in Ihrem Code hinterlassen haben. Ich weiß, wie gerne Sie Datenbanksicherungen wiederherstellen !: D"
Ant
2
@Ant: Sei nett. Tun Sie dies kurz nach dem geplanten Backup, nicht kurz zuvor.
Donal Fellows
@Donal: Machen Sie es kurz nach dem Backup, sagen Sie ihnen dann, dass das Backup fehlgeschlagen ist, und lassen Sie sie den Rest des Tages schwitzen, bevor Sie das Backup über Nacht wiederherstellen.
Jwenting
8

Sie können sie beauftragen, eine Klasse zu besuchen, sobald sie Ihrem Unternehmen beitreten, bevor sie Zugriff auf die Quellcodeverwaltung haben. Dadurch werden sie in SQL-Injektionen, Cross-Site-Scripting, Cross-Site-Request-Fälschung und andere häufige Schwachstellen eingeführt. Behandeln Sie Beispiele von Angesicht zu Angesicht, brechen Sie schlechten Code vor sich, lassen Sie sie schlechten Code brechen und verweisen Sie sie auf die OWASP-Site, um weitere Informationen zu erhalten, sobald sie ihren Abschluss gemacht haben.

Sie können zusätzlich die Verwendung einer benutzerdefinierten Bibliothek vorschreiben, die dies für Sie erledigt. Dies ist jedoch nur eine sekundäre Lösung, da sie sicher benutzerdefinierte Abfragen ausführen wird, wenn dies bequemer wird.

Wenn Sie über die Ressourcen verfügen, kann es auch nützlich sein, sicherzustellen, dass mehr hochrangige Mitglieder des Teams ihre Unterschiede vor dem Festschreiben überprüfen.

Wissen ist Macht!

Yan
quelle
3
Es ist besser, sie auszusortieren, bevor sie in Ihr Unternehmen eintreten. Wenn Sie jemanden einstellen, der etwas schreibt, das SQL verwendet, stellen Sie keine Interviewfragen zu Injektionsgrenzen an Inkompetenz.
Wooble
Ich stimme im Allgemeinen zu, aber ein sehr kluger und ehrgeiziger Nachwuchs ist viel, viel billiger als ein "PHP-Entwickler mit N Jahren Erfahrung", der garantiert nicht so viel besser ist. Intelligente Junior-Entwickler können dieses Zeug sehr schnell aufgreifen und sind ein ziemlicher Gewinn.
Yan
3

Unter der Annahme, dass es sich um die Unsicherheit handelt, auf die sich andere als Entwickler jeder Ebene bezogen haben, kann man leicht vergessen, dass getPost () die Daten nicht zuerst sichert.

Ein Weg, um dies zu umgehen, ist:

  1. Schreiben Sie eine Klasse, die alle POST / GET-Daten abruft und sie unverändert in eine Singleton-Klasse mit dem Namen 'unsicheres_Daten' schreibt. Löschen Sie dann die POST / GET-Arrays.
  2. Entwickler müssen dann POST / GET-Daten aus dem Array 'unsicheres_Daten' abrufen, nicht aus POST / GET-Arrays.

Jeder Entwickler, der etwas aus einem Array namens "unsichere_Daten" abruft und sich nicht die Mühe macht, es zu sichern, ist entweder unwissend oder faul. Wenn es das erstere ist, bieten Sie Schulungen an, danach muss es das letztere sein - und dann haben Sie ein Disziplinarproblem, kein Programmierproblem.

Dan bläst
quelle
Wow, das ist unnötig kompliziert und löst das Problem immer noch nicht. Es geht nicht nur darum, die Eingabe zum Spaß zu bereinigen, sondern die Daten, die Sie in die Datenbank einfügen, zu bereinigen, und diese Daten könnten theoretisch von überall stammen, von einem Webformular oder einer E-Mail oder einem XML-Dokument, das jemand lädt hoch. In all diesen Fällen müssen Sie das Scrubing durchführen, wenn es in die Datenbank geht.
Roger Halliburton
@RogerHalliburton Natürlich ist es löst nicht alles, aber es ist ein Konzept (eine Art Design - Muster, wenn man so will) , anstatt eine voll konkretisiert Sicherheitsmaßnahme unsichere Daten zu machen Blick unsicher.
Dan Blows
Ah ich sehe. Aber Sie kämpfen nur gegen die menschliche Natur, wenn Sie jemandem sagen "Dieses Objekt ist unsicher, es sei denn, es ist als sicher gekennzeichnet" und er versucht, es für etwas zu verwenden. Meistens werden sie es als sicher kennzeichnen, ohne es tatsächlich zu überprüfen. Nun, genießen Sie den Reputationsschub.
Roger Halliburton
Aus der Sicht eines Junior-Entwicklers wird durch das Anzeigen von $ unsicheren_Daten ein Flag so ausgelöst, dass das Anzeigen von $ postdata (oder was auch immer) dies nicht tut. Die Idee stammt von Joel Spolskys "Falschen Code falsch aussehen lassen" . Wenn die menschliche Natur Ihrer Entwickler diese rote Fahne ignoriert, müssen Sie entweder viel Schulung anbieten oder neue Entwickler gewinnen.
Dan Blows
Ich halte Spolsky nicht auf einem Podest. Dies sind Entwickler, die inkonsistente Tabs leicht ignorieren. Sie werden nicht zweimal darüber nachdenken, etwas zu verwenden, das als "unsicher" bezeichnet wird.
Roger Halliburton
1

Eine der besten Anleitungen, die ich zur Web-Sicherheit gelesen habe, ist diese Ruby on Rails- Sicherheitsanleitung. Obwohl es sich um Ruby on Rails handelt, gelten viele Konzepte für jede Webentwicklung. Ich würde jeden neuen ermutigen, diesen Leitfaden zu lesen.

Mistagrooves
quelle
2
Jeder weiß, dass Ruby nicht sicher ist.
Roger Halliburton
5
@ Roger: "Jeder kennt" alle möglichen Dinge, die wahr sein könnten oder nicht. Ich befürworte einen realitätsbasierten Programmieransatz, keinen hörensagenbasierten.
Donal Fellows
0

Der Code, den Sie oben verlinkt haben, ist anfällig für einen SQL-Injection-Angriff, da die HTTP-Eingaben, die Sie in der Abfrage verwenden, nicht mit mysql_real_escape_stringanderen Mitteln bereinigt wurden .

Ryan
quelle
1
Oh, ich dachte, wir beantworten dies wie eine Testfrage:]
Ryan
Downvotes sind etwas lahm, da der Wortlaut der Frage nachträglich geändert wurde: P
Ryan
0

In Bezug auf Ihre (vermutlich übergeordnete) Frage "Wie kann ich Programmierer dazu bringen, damit aufzuhören?" Würde ich sagen, dass Sie sie regelmäßig betreuen, das betreffende Problem (und die möglichen Auswirkungen usw.) sorgfältig erläutern und hervorheben Die Bedeutung von Code-Schwachstellen (sowohl in Bezug auf SQL-Injection als auch Cross-Site-Scripting usw.) ist wahrscheinlich die sinnvollste Lösung.

Wenn sie trotz alledem immer wieder durcheinander kommen (vielleicht möchten Sie ein Auge auf ihre Verpflichtungen usw. werfen, anstatt "live" herauszufinden), besteht das Problem entweder darin, dass Sie sie als Mentor im Stich lassen, oder dass Vielleicht müssen sie etwas finden, das besser für ihren Lebensunterhalt geeignet ist.

John Parker
quelle