Frage:
Unterrichten eines geliebten Menschen über sichere Codierungspraktiken
schroeder
2012-12-12 22:00:57 UTC
view on stackexchange narkive permalink

Dies mag viel zu eng sein, ist jedoch für ITSec-Experten ein einzigartiges Problem. Eine geliebte Person beginnt gerade eine neue Programmierkarriere und ich habe die Freude zu sehen, wie sie die grundlegendsten Programmierkonzepte von Grund auf lernt. Sie ist in jedem ihrer College-Kurse an der Spitze ihrer Klasse und produziert qualitativ hochwertige Arbeit. Sie hat so viel Aufmerksamkeit auf sich gezogen, dass sie bereits Vertragsarbeit bekommt.

Als ITSec-Profis sprechen wir davon, den Entwicklungszyklus mit sicheren Codierungspraktiken und -designs zu versehen. Aber wie trifft dies auf einen brandneuen Lernenden zu? Ein neuer Programmierer steht sozusagen am Anfang seines eigenen "lebenslangen Entwicklungszyklus". Ab wann ist es aus pädagogischer Sicht angebracht, von der Denkweise „es zum Laufen zu bringen“ zu „es muss absolut sicher sein“ zu wechseln? Ab wann sollte eine Schülerin eine Aufgabe aufgrund eines Sicherheitsproblems „nicht bestehen“?

Sie versteht die Notwendigkeit, sicheren Code zu erstellen, vollständig und möchte dies, aber keine ihrer Klassen hat die Idee eingeführt und kommt weiter für mich zur Codeüberprüfung und -analyse. Wann sollte der Wechsel erfolgen, um sie zu zwingen, alle Klassenzuweisungen neu zu gestalten, um sicheres Design zu verwenden?

Ich möchte eine vielversprechende Karriere nicht durch die Einführung frustrierender Anforderungen abbrechen, aber ich möchte auch Geben Sie dieser neuen Karriere den bestmöglichen Start. Gibt es außerdem Ressourcen, die mir helfen, ihr die Grundlagen des sicheren Codierens aus der Sicht eines beginnenden Programmierers beizubringen? Ich finde, dass ich es mir im Laufe der Zeit ausgedacht habe ...

Ich begrüße Ihren Rat.

  • Ab wann ist es aus pädagogischer Sicht angemessen, dies zu tun von der Denkweise „es zum Laufen bringen“ zu „es muss absolut sicher sein“ wechseln?
  • Wann sollte ein Schüler eine Aufgabe aufgrund eines Sicherheitsproblems "nicht bestehen"?
  • Wann sollte der Wechsel vorgenommen werden, um ihn zu zwingen, alle zu verwendenden Klassenaufgaben neu zu gestalten sicheres Design?
  • Gibt es Ressourcen, die mir helfen, ihr die Grundlagen des sicheren Codierens aus der Sicht eines Programmieranfängers beizubringen?

Als Randnotiz: Ich habe dies bemerkt, indem ich die Messlatte höher gelegt habe Bei meiner Codeüberprüfung ihrer Klassenzuweisungen, nur im Hinblick auf die grundlegende Sicherheit zum Validieren und Desinfizieren, hat sie im Allgemeinen Code von sehr hoher Qualität erstellt. An diesem einen Beispiel kann ich den Wert eines Bildungsbeginns auf diese Weise erkennen, da dies ein noch tieferes Verständnis des Datenflusses und der Programmierlogik erzwingt.

Ihr Fragentitel lässt den Kontext wirklich komisch klingen. Sie erwähnen, dass sie eine geliebte Person ist, aber der Inhalt klingt so, als wären Sie ihre Lehrerin. Ich meine, was auch immer Ihr Boot schwimmt, aber ... O_o
Sie ist eine geliebte Person und ich bin eine Pädagogin, nur weder ihre noch eine Programmierlehrerin :) Es ist schwer, jemals den 'Pädagogen'-Hut abzunehmen, und sie kommt immer wieder zu mir, um' außerschulische 'Arbeit zu leisten :)
Da "es muss unbedingt sicher sein" in der Praxis kaum (sicher) erreichbar ist, frage ich mich, ob dies pädagogisch angemessen ist. IMHO wäre es besser, auf Literatur zu Risiken im Internet hinzuweisen.
Nur darauf hinzuweisen, dass die Mängel vorhanden sind, ist meiner Meinung nach das Wichtigste, was Sie tun können (d. H. Kritisches Denken anregen und es frühzeitig tun). Sie müssen ihr nicht die Einzelheiten mitteilen oder sie sogar bitten, sie zu finden, aber lassen Sie sie wissen, dass irgendwo in diesem Code ... diese fiesen Exploits warten nur darauf, gefunden zu werden
Was ist der Unterschied zwischen dem Programmieren eines "geliebten Menschen" und "jedem"?
@Midhat Sie haben in Ihren Interaktionen wesentlich mehr Einfluss auf einen geliebten Menschen als auf eine zufällige Person.
Sechs antworten:
user10211
2012-12-12 22:41:02 UTC
view on stackexchange narkive permalink

Ich würde sagen, eine gute Möglichkeit zu lernen ist, dass sie die bereits geschriebenen Anwendungen bricht .

Angenommen, sie schreibt Webanwendungen, zeigen Sie sie auf die OWASP-Spitze 10. Lassen Sie sie sehen, ob sie einen dieser Fehler in ihrem eigenen Code finden kann. Es gibt keinen besseren Weg, um mehr über Sicherheitskonzepte zu erfahren, als sie tatsächlich in Ihrem eigenen Code zu sehen.

Wenn ein Fehler gefunden wurde, lassen Sie sie die Anwendung neu schreiben, um den Fehler zu beheben. Auf diese Weise kann sie die Auswirkungen von Dingen wie Hygiene und Validierung von Benutzereingaben und parametrisierten Abfragen einschätzen.

Ergreifen Sie inkrementelle Schritte. Ich würde nicht sofort mit dem Entwerfen einer neuen Anwendung beginnen, bevor ich wirklich verstehe, welche Art von Codes zu Sicherheitslücken führen.

Einverstanden. Es hat nicht nur Spaß gemacht, die Aufgaben meiner Klassenkameraden zu brechen und meine Aufgaben in meiner Highschool-Programmierklasse zu erledigen. Aber ich habe mehr getan, um die Wichtigkeit der Eingabesanierung zu demonstrieren, als jede formelle Anweisung, die ich danach hatte.
Jep! Ich wusste nichts über Sicherheit in einer Webanwendung, bis mich ein Angreifer sehr verarscht hat. SQL Injections, Remotecodeausführung, Durchlaufen des Dateisystems ... all diese Sicherheitslücken waren in meiner kleinen Webanwendung. Junge, war ich damals naiv, wenn Kunden immer erwartete Daten senden ...
Everett
2012-12-12 23:59:59 UTC
view on stackexchange narkive permalink

Ich werde die Position einnehmen, die mich flambieren lässt ...

Das Problem, das ich sehe, ist, dass sicheres Programmieren als Add-On gelehrt wird. Best Practices sollten von Anfang an vermittelt werden (einschließlich Sicherheit). Die Lüge, die den Menschen beigebracht wird, ist, dass Übung den Präfekten macht. Die Wahrheit ist, dass Übung dauerhaft macht. Wenn Sie es also falsch machen, müssen Sie verlernen, was Sie gelernt haben. Das ist ein Bassackwards-Ansatz.

Ich würde sagen, dass sichere Codierungspraktiken vom ersten Tag an gelehrt werden sollten. Es gibt keinen Grund, zu lernen, wie man es macht, und dann zu lernen, wie man es sicher macht. Es ist eine Verschwendung von Zeit und Geld ...

Meine 2 Bits, 1 und null mehr zu sagen ...

Aber dann müssten Sie vom ersten Tag an alle Aspekte der Best Practices einbeziehen, und dies würde mindestens 10+ Aspekte bedeuten, über die Sie sich Sorgen machen müssen, wenn jemand noch nicht einmal Programmieren gelernt hat. Wie ist das überhaupt für die meisten Sterblichen möglich?
@ArnabDatta Bloße Sterbliche sollten nicht programmieren.
Ich bin im Moment in der Uni und sichere Codierung wird kaum erwähnt. Es gibt ein separates Modul, aber das ist nicht obligatorisch ... Wenn also die anderen Schüler, die gerade erst mit PHP begonnen hatten (fügen Sie eine andere Sprache hinzu, die Sie wünschen), ihre Aufgaben markiert hatten, ging ich und zeigte sie, schauen Sie, ob ich es tue Das habe ich gerade deine Kursarbeit zerstört ... Ich habe das nicht böswillig gemacht und ich habe es nur Freunden angetan, aber sie sind alle weggegangen und haben versucht, die Sicherheitslücken zu schließen. Es war ein ziemlicher Augenöffner für sie
Ich stimme ziemlich zu (und habe die Fragen positiv bewertet), aber ich würde eher zum zweiten als zum ersten Tag übergehen. Am Anfang ist es für den unerfahrenen Programmierer zu aufwendig, nur etwas zum Laufen zu bringen. Beginnen Sie ungefähr ein Drittel des ersten Semesters.
Ich stimme dieser Antwort zu.Im Jahr 2017 sollte Sicherheit ebenso wie die Datenpersistenz ein zentrales Codierungskonzept sein.Sie müssen neue Programmierer nicht mit allem Sicherheit überladen, aber neue Programmierer sollten wissen, wie sie Daten zwischen Systemen übertragen und Daten sichern können, die ihre App gemäß den heutigen Best Practices verfügbar macht.Neue Programmierer können auf einem einzigen System starten, wobei alle Eingaben von der Tastatur und alle Ausgaben auf den Bildschirm oder die lokale Festplatte gehen, um die Lernkurve der Sprache und der Programmierung nicht zu verkomplizieren.
KeithS
2012-12-13 01:57:42 UTC
view on stackexchange narkive permalink

Obwohl ich Everett grundsätzlich zustimme, gibt es noch einen anderen Standpunkt. Der Sinn einer Lektion besteht darin, ein Konzept zu lernen, auf das dann weiter aufgebaut werden kann. Dies verringert die Steigung der Lernkurve. Zu viel zu schnell zu unterrichten ist überwältigend; Bei einem Ansturm von Informationen "lecken" die meisten Gehirne.

Es ist großartig zu sagen, dass "sichere Codierungspraktiken vom ersten Tag an gelehrt werden sollten", und es ist sehr schwer zu demonstrieren, wie diese erste Welt "Hallo Welt" "Programm kann anfällig sein, insbesondere wenn" Was ist ein Computerprogramm? "ein neues Konzept für die Klasse ist. Ein Website-Projekt, das gemeinsam genutzte Datenspeicher berührt (was ich erst in der Mitte des Studiums wirklich gesehen habe), ist leichter zu erkennen, aber häufig sind diese Schwächen mit der Einrichtung einer grundlegenden Proof-of-Concept-Webumgebung mit dem " Standardeinstellungen. Es ist sehr einfach zu beweisen, dass eine Anwendung Schwachstellen aufweist, wenn die Schwachstellen bekannt sind. Es ist schwieriger (wirklich unmöglich) zu beweisen, dass es keine gibt.

Ich denke ähnlich wie beim OP; Irgendwann in der Entwicklung eines Programmierers kann die Idee "Wie könnte jemand diesen Code verwenden, um Dinge zu tun, die er nicht tun soll, und wie können Sie dies verhindern?" in das, was Sie tun, integriert werden. Dieser Ausgangspunkt liegt wahrscheinlich irgendwo in der Nähe, um entweder etwas über externe Kommunikation oder Persistenz (Lesen / Schreiben von Daten auf eine Festplatte oder Datenbank oder Senden über einen Netzwerkkanal) oder die objektorientierten Prinzipien (Vererbung, Überlastung / Überschreiben) zu lernen. etc), je nachdem, was zuerst eintritt. Hier kann ein Codierer beginnen, Programme zu schreiben, die in den falschen Händen Schaden anrichten können. Daher sollte darauf geachtet werden, dass die falschen Hände das Programm nicht missbrauchen können.

Einige Konzepte sind leicht zu verstehen. "Mein Programm arbeitet mit Daten, die ein Geheimnis seiner Benutzer sind. Mir wird vertraut und ich muss sicherstellen, dass nur diejenigen, die die Daten sehen sollten, dazu berechtigt sind." Einige sind schwieriger; Ich habe Leute gesehen, die wirklich schockiert sind, als sie herausfanden, dass Programm-Binärdateien dekompiliert und gelesen werden können, um fest codierte Anmeldeinformationen oder Schlüssel zu ermitteln (und dass einige Umgebungen wie .NET genügend Metadaten in die Binärdateien einfügen, um fast genau den gleichen Quellcode zu erzeugen, der zum Erstellen verwendet wurde sie) oder dass ihre zusammengestellte Binärdatei in ihrer kompilierten Form von einem Angreifer huckepack genommen werden kann, der öffentliche nicht versiegelte Klassen oder Mitglieder einbindet und dann Zugriff auf alle Geheimnisse hat, mit denen diese Klassen arbeiten. Dies sind die grundlegenden Fallstricke, die veranschaulicht werden sollten, und dann sollten Lösungen für diese veranschaulicht werden und wie und warum sie funktionieren, erklärt werden.

Sie können immer mit Bewusstsein beginnen. Ich denke, es würde ungefähr so ​​aussehen: Okay, wir haben "Hello World" beendet. Kann sich jemand eine Möglichkeit vorstellen, dieses Programm dazu zu bringen, etwas zu tun, für das es nicht entwickelt wurde? "Die wahrscheinliche Antwort lautet" Nein ", und das ist auf dieser Ebene in Ordnung. Aber stellen Sie zumindest die Frage. Bringen Sie vor, dass dies eine Überlegung ist. Starten Sie den Dialog. Warten Sie bis zum dritten Jahr, um zu sagen: "Okay, Sie haben all diese Codierungstechniken gelernt. Jetzt werden wir Ihnen zeigen, wie anfällig Ihre Krücken sind." Ist eine schlechte Form ... nicht wahr?
Bis zu einem gewissen Punkt einverstanden. Es dauerte solide anderthalb Jahre, bis meine C ++ - Klasse an der High School so weit fortgeschritten war, dass Programme genug Macht über die Systeme hatten, auf denen sie ausgeführt wurden, um tatsächlich Sicherheitslücken zu bilden, und erst nach der Hälfte des College begann ich, Code zu schreiben Dies wäre in einem realen Kontext öffentlich bekannt geworden (und wäre daher für seine Sicherheit gegen Angriffe unabhängiger als eine Intranetsite oder ein lokaler Thick Client, der hauptsächlich von einem kompetenten Systemadministrator abhängig ist).
Möglicherweise können Sie am ersten Tag keine Sicherheitsprogrammierung unterrichten, aber ein vernünftiges Programm am zweiten Tag ist möglicherweise geeignet: Wie reagiert Ihr Programm zum Erraten von Zahlen, wenn Sie die Zahl "q" erraten?Wie reagiert Ihr wiederholter "Hallo" -Drucker, wenn Sie ihn bitten, -3-mal "Hallo" zu drucken?Sobald Sie das Konzept der Eingabe einführen, können Sie über die Bereinigung der Eingabe sprechen.
AviD
2012-12-13 15:24:26 UTC
view on stackexchange narkive permalink

Ähnlich wie bei anderen Aspekten einer echten Bildung (vielleicht sollte dies eher bei Parenting.SE liegen ...), denke ich, dass es wieder zu kritischem Denken kommt.

Meine Tochter nimmt auch an einigen CS-Kursen am College teil und ich helfe ihr dabei, diese durchzuarbeiten. Ich füttere sie jedoch nicht mit dem Löffel, sie muss dafür arbeiten.
In vielen Fällen erkläre ich ihr etwas sehr Falsches und erwarte, dass sie mich darauf anruft. (Normalerweise tut sie das). Manchmal ist es nur subtil falsch, und dann fällt es ihr schwerer, es zu bemerken. Manchmal merkt sie es nicht sofort und beginnt, etwas aufzubauen, das auf einer falschen Annahme basiert - dann muss sie rückwärts arbeiten, um das Problem zu finden. (Sie wird auch darin besser.)

Auf diese Weise zwinge ich sie, sich daran zu gewöhnen, Annahmen in Frage zu stellen.
Sie ist zugegebenermaßen nicht begeistert von meinen Methoden.

Auf die gleiche Weise bitte ich sie, herauszufinden, wie ihr Code versehentlich oder böswillig missbraucht werden kann. Ich erklärte ihr, dass sie ihren Code besitzt und für das verantwortlich ist, was ihr Code tut , hier kein Raum für Passivität. Ein Teil davon ist die ordnungsgemäße Behandlung von Ausnahmen, die ihre Ausbilder ohnehin von ihnen erwarten, auch ohne sich erst viel später darauf einzulassen.

Nun lehne ich natürlich alle Formen des Unterrichts "Frachtkultprogrammierung" ab - es sei denn, dies wird ausdrücklich als solches vermerkt , damit die Grundkonzepte mit dem unterrichtet werden können Vorbehalt, dass es nicht die ganze Geschichte ist und wir später darauf zurückkommen werden. (Wie die obige Ausnahmebehandlung).

Mein Punkt dabei ist, dass "sichere Programmierung" sich nicht von "Programmierung" unterscheidet.
So wie das gesamte Buch der Programmierung nicht in einer Sitzung auf einmal unterrichtet werden kann, sondern Konzepte schrittweise eingeführt werden, könnten die "Sicherheits" -Aspekte der Programmierkonzepte warten, während das Grundkonzept mit dem Expliziten gelehrt und verstanden wird Beachten Sie, dass "wir hier noch nicht fertig sind". Auch die Erwartung, dass zumindest die besseren Schüler einige der unsicheren Aspekte herausfinden würden.

TL; DR :

  1. Ein neues Programmierkonzept muss schrittweise erlernt werden. Einige Aspekte (einschließlich Sicherheit) können später als andere vermittelt werden ;;
  2. Das Programmierkonzept ist erst dann vollständig , wenn alle Aspekte einschließlich Sicherheitsaspekte gelernt und verstanden wurden (und sollte bis dahin beachtet werden).
  3. Programmierer haben die vollständige Kontrolle über ihren Code, und um Programmierer zu sein, muss man wissen, wie der eigene Code missbraucht werden kann.
  • Schüler, die kritisches Denken üben, sollten dies frühzeitig selbst herausfinden (nicht unbedingt alle der Sicherheit, sondern der fehlende Kontext und ein großer Teil des Code-Missbrauchs).
  • Schüler, die nicht kritisch denken, sollten nicht wirklich Programmieren lernen ...
+1 für 'Frachtkultprogrammierung' und Punkt 5. Ich wünschte, mehr ihrer Ausbilder würden sie den Weg der Primeln entlang führen, um Probleme mit bestimmten Ansätzen aufzudecken. Ich kann nicht genau das tun, was Sie mit Ihrer Tochter tun, aber Ihr Ansatz hat mich daran erinnert, immer wieder einen Weg zu finden, das irgendwie zu nutzen.
AJ Henderson
2012-12-12 22:27:04 UTC
view on stackexchange narkive permalink

Ich denke, dass es letztendlich darauf ankommt, herauszufinden, an welchem ​​Punkt die Sicherheitserziehung den Punkt der Lektion nicht verschleiert. Unterrichtsaufgaben sind in der Regel vereinfachte Probleme, mit denen ein bestimmtes Problem aufgedeckt und gezeigt werden soll, wie dieses bestimmte Problem gelöst werden kann.

Ich denke, der idealere Weg, dies zu erreichen, besteht darin, sie so etwas wie ausführen zu lassen hackthissite.org, um zu erfahren, wie viele Angriffe funktionieren und welche Gefahren bestehen. Ein gesundes Verständnis dafür, wie Code untergraben werden kann, ist eine großartige Möglichkeit, um jemandem zu helfen, die Bedeutung sicherer Codierungspraktiken zu verstehen. Wenn Sie dies parallel tun, werden die Themen, mit denen sich ihre Kursleiter befassen, nicht verschleiert, und es werden auch die Sicherheitsbedenken aufgezeigt.

Ich habe an Ihren parallelen Ansatz gedacht, mich aber gefragt, wie ich die Lücke schließen kann, um vom Beginn eines neuen Projekts an die richtige Codierung zu implementieren. Ich glaube, ich habe die Grundlagen behandelt (validieren und desinfizieren), aber ich möchte den nächsten Schritt erreichen: das grundlegende Design.
Ich würde sagen, dass es wahrscheinlich ein einzigartiges Projekt ist. Nehmen Sie vielleicht sogar eines ihrer komplexeren Projekte, das Lücken aufweist, und vergleichen Sie damit die Schwierigkeit, zurück zu gehen und die Sicherheit nachzurüsten, mit der von Anfang an guten Sicherheit. Schwer zu sagen, ohne die tatsächlichen Projekte zu sehen, aus denen Sie auswählen müssen. Ich weiß für mich, dass es ausreichte, nur mit den Angriffen vertraut und vertraut zu sein, um meine Entwürfe zum Ausgleich zu erstellen, aber andererseits habe ich auch programmiert, seit ich 5 Jahre alt war ...
Deele
2012-12-13 14:53:15 UTC
view on stackexchange narkive permalink

Aus meiner Sicht gibt es als Systemanalytiker einen Weg: Sie sollten Erstklässlern ein Konzept der Standardisierung, Klassifizierung und Mustererkennung vermitteln. Die folgenden Fragen sind einfach und können gleich zu Beginn gestellt werden ...

  • Denken Sie an "alle möglichen Dateneingaben", die der Benutzer eingeben kann, und erstellen Sie eine strenge Liste von ihnen.
  • Reguläre Ausdrücke lernen / lehren. Dieses Tool kann entweder zum Abgleichen und zur Bereinigung verwendet werden.
  • Prinzip der "Standardwerte", wenn Eingabedaten fehlen oder ungültig sind.
  • Verwenden Sie Protokolldateien. Wenn Zweifel oder Inkonsistenzen bei der Eingabe bestehen, sollte die Software eine Art Protokollierung verwenden, um "das aufzuschreiben". Protokolldateien sind eine der besten Möglichkeiten, um Sicherheitslücken zu debuggen und herauszufinden, die jemand verwenden könnte oder bereits verwendet.
  • Verwenden Sie Fehlermeldungen und Fehlerfälle. Denken Sie an Fälle, in denen das System ausfallen könnte, und denken Sie an die entsprechende Fehlernummer und die ausführliche Meldung. Einige Fehler können zu zwei verschiedenen ausführlichen Fehlermeldungen führen - eine für Benutzer, schlicht und einfach, eine für den Eigentümer des Systems - für Debug- oder Sicherheitszwecke.

Benutzer ist immer "Bösewicht", Der Benutzer möchte Ihre Software immer beschädigen. Geben Sie dem Benutzer niemals mehr Informationen, als er verlangt. Wenn er danach fragt, überprüfen Sie immer, ob er berechtigt ist, auch nur die Antwort "Sie haben keinen Zugriff" zu erhalten. Fehlermeldungen können helfen Hacker, um den Zustand des Systems zu verstehen, versucht er zu brechen.

Könnte an mehr denken, aber dies kann und sollte von Anfang an gelehrt werden.

Ich würde gerne Nachforschungen über den Erfolg des Unterrichts von Regex für Erstklässler anstellen. Wenn es möglich ist, würde es so viele kognitive Probleme lösen, wie sie erwachsen werden ...
@schroeder Persönlich begann ich mit Ben Fortas kleinem Buch http://www.forta.com/books/0672325667/, das ins Russische übersetzt wurde. Aber ich denke, die meisten Professoren / Lehrer verstehen Regex nicht selbst, deshalb unterrichten sie es nicht.


Diese Fragen und Antworten wurden automatisch aus der englischen Sprache übersetzt.Der ursprüngliche Inhalt ist auf stackexchange verfügbar. Wir danken ihm für die cc by-sa 3.0-Lizenz, unter der er vertrieben wird.
Loading...