Frage

Beim schreiben von code tun Sie Programm bewusst defensiv, um eine hohe Programm-Qualität und zu vermeiden die Möglichkeit von code ausgenutzt werden, in böser Absicht, z.B.durch Pufferüberlauf-exploits oder code-injection ?

Was ist das "minimum" Qualität werden Sie immer die für Ihren code ?

War es hilfreich?

Lösung

In meiner Linie der Arbeit, unser code top-Qualität.
So, wir konzentrieren uns auf zwei Dinge:

  1. Prüfung
  2. Code-reviews

Diejenigen, die nach Hause bringen das Geld.

Andere Tipps

Ähnlich abyx, in der Mannschaft bin ich auf die Hersteller verwenden immer die unit-Tests und code-reviews.Zusätzlich zu, dass ich auch versuchen, stellen Sie sicher, dass ich nicht code integrieren, dass die Menschen Mai verwenden Sie - ich Neige dazu, code zu schreiben, nur für die basic-Reihe von Methoden für das Objekt an die hand, um die Funktion wie Rahmengeometrie aus.Ich habe gefunden, dass die Einbeziehung der Methoden, die möglicherweise nie verwendet werden, bieten aber kann die Funktionalität unabsichtlich eine "Hintertür" oder unbeabsichtigten/unerwarteten Einsatz in das system.

Es ist viel einfacher später wieder zu gehen und einzuführen, Methoden, Attribute und Eigenschaften, die gefragt werden, gegen die Vorwegnahme von etwas, das nie kommen können.

Ich würde empfehlen, die defensive für Daten, geben Sie eine "Komponente" oder Rahmen.Innerhalb einer "Komponente" oder Rahmen, sollte man meinen, dass die Daten "richtig".

Denken, wie dies.Es ist bis zu die Anrufer an die richtigen Parameter ansonsten sind ALLE Funktionen und Methoden haben, um zu überprüfen alle eingehenden parameter.Aber wenn die Prüfung wird nur durchgeführt, für den Anrufer ist, wird die Prüfung nur einmal.So, sollte der parameter "richtig" und so weitergegeben werden können, um den unteren Ebenen.

  1. Überprüfen Sie immer die Daten aus externen Quellen, Benutzer etc
  2. Eine "Komponente" oder der Rahmen sollten immer prüfen, ob eingehende Anrufe.

Wenn es ist ein bug und ein falscher Wert verwendet wird, der in einem Aufruf.Was ist wirklich das richtige todo?Man muss nur ein Indiz dafür, dass die "Daten" - das Programm arbeitet, ist falsch und einige, wie BEHAUPTET, aber andere verwenden möchten advanced error reporting und mögliche Fehler recovery.In jedem Fall werden die Daten nicht vertragskonform und in einigen Fällen ist es gut, weiter zu arbeiten auf es.(Hinweis: es ist gut, wenn Server nicht sterben mindestens)

Ein Bild geschickt von einem Satelliten könnte, um zu versuchen, advanced error recovery auf...ein Bild aus dem internet heruntergeladen zu setzen, wird ein Fehler-Symbol für...

Ich empfehle Menschen, die code schreiben, der faschistischen in die Entwicklungsumgebung und ehrenamtlich in der Produktion.

Während der Entwicklung, die Sie fangen wollen schlechte Daten/Logik/code so früh wie möglich zu verhindern, dass Probleme, entweder unbemerkt oder die später Probleme, bei denen die Ursache ist schwer zu verfolgen.

In der Produktion und den Umgang mit Problemen wie anmutig wie möglich.Wenn etwas wirklich ist ein nicht behebbarer Fehler dann Griff Sie es und präsentieren die Informationen an den Benutzer.

Als Beispiel ist hier unser code zu Normalisieren eines Vektors.Wenn Sie füttern es, falsche Daten in der Entwicklung, wird es Schreien, in der Produktion gibt es eine Sicherheit Wert.

inline const Vector3 Normalize( Vector3arg vec )
{
    const float len = Length(vec);
    ASSERTMSG(len > 0.0f "Invalid Normalization");
    return len == 0.0f ? vec : vec / len;
}

Ich arbeite immer um zu verhindern, dass Dinge wie injection-Angriffe.Jedoch, wenn Sie arbeiten auf einer internen intranet-Seite, die meisten Sicherheitsfunktionen fühlen, wie sich der Aufwand.Ich weiß noch, vielleicht nur nicht so gut.

Nun, es gibt eine bestimmte Reihe von best practices für die Sicherheit.Zumindest für Datenbank-Anwendungen, die Sie benötigen, to watch out for SQL Injection.

Andere Sachen wie hashing Passwörter, Verschlüsselung von Verbindungszeichenfolgen, etc.auch ein standard.

Von hier aus auf, es hängt von der tatsächlichen Anwendung.

Zum Glück, wenn Sie mit frameworks wie .Net, viel Sicherheit Schutz gebaut-in.

Sie müssen immer auf dem Programm defensiv würde ich sagen, auch für die internen apps, ganz einfach, weil die Benutzer könnte nur durch reines Glück etwas schreiben, bricht Ihre app.Zugegeben Sie wahrscheinlich nicht haben, um sorgen über versucht, Sie zu betrügen Geld, aber immer noch.Immer Programm defensiv und übernehmen die app schlägt fehl.

Mit Test-Driven Development, hilft sicherlich.Schreiben Sie eine einzelne Komponente zu einem Zeitpunkt, und dann aufzählen aller möglichen Fälle für die Eingänge (über Prüfungen) vor, die den code schreiben.Dies stellt sicher, dass Sie alle Grundlagen abgedeckt haben und noch nicht geschrieben cool code, den niemand verwenden wird, aber brechen könnte.

Obwohl ich nicht alles tun, formelle ich in der Regel verbringen einige Zeit mit jeder Klasse und gewährleisten, dass:

  1. wenn Sie in einem gültigen Zustand befindet, dass Sie den Aufenthalt in einem gültigen Zustand
  2. es gibt keine Möglichkeit, Sie bauen sich in einem ungültigen Zustand
  3. Unter außergewöhnlichen Umständen, Sie wird scheitern, wie anmutig wie möglich (Häufig ist dies ein cleanup und werfen)

Es hängt davon ab.

Wenn ich bin wirklich hacken etwas für meinen eigenen Gebrauch, dann Schreibe ich die beste code, den ich nicht zu denken.Lassen Sie den compiler meinen Freund für Warnungen etc.aber ich werde das nicht automatisch erstellen-Typen für die Hölle der es.

Desto eher wird der code verwendet, auch gelegentlich, ich Rampe bis das Niveau der Kontrollen.

  • minimal magic numbers
  • bessere Variablennamen
  • vollständig überprüft und definiert ein array/string-Längen
  • programming by contract Behauptungen
  • null-Wert überprüft
  • Ausnahmen (je nach Kontext des Kodex)
  • grundlegende Erläuterungen
  • Barrierefreier Unterlagen (wenn perl, etc.)

Nehme ich eine andere definition von defensiven Programmierung, als die eine, die ist vertreten durch Effektive Java von Josh Bloch.In dem Buch spricht er darüber, wie zu behandeln veränderliche Objekte, die Anrufer-pass-code (z.B., in setter), und veränderliche Objekte, die Sie an Anrufer (z.B., in Getter).

  • Für setter, stellen Sie sicher, dass jeder Klon veränderliche Objekte, und speichern Sie die Klon.Auf diese Weise wird der Anrufer nicht ändern kann das übergebene Objekt nach der Tat zu brechen, Ihr Programm Invarianten.
  • Für Getter, kehren Sie entweder eine unveränderliche Sicht auf Ihre internen Daten, wenn die Schnittstelle erlaubt es;oder sonst, die Rückkehr ein Klon der internen Daten.
  • Beim Aufruf Benutzer-geliefert Rückrufe mit internen Daten, senden in eine unveränderliche Ansicht oder Klon, soweit angemessen, es sei denn, Sie beabsichtigen, den Rückruf, um die Daten zu ändern, in diesem Fall müssen Sie überprüfen, nach der Tat.

Die take-home-message ist zu machen Sie sicher, dass keine externen code zu halten, kann ein alias für beliebige veränderliche Objekte, die Sie intern verwenden, so dass Sie können erhalten Ihre Invarianten.

Ich bin sehr der Meinung, dass eine korrekte Programmierung wird der Schutz gegen diese Risiken.Dinge wie die Vermeidung von veralteten Funktionen, die (in der Microsoft C++ - Bibliotheken mindestens) sind Häufig veraltet, weil von Sicherheitslücken, und überprüfen alles über eine externe Grenze.

Funktionen, die nur von Ihrem code sollte nicht erfordern übermäßige überprüfung der parameter, weil Sie die Kontrolle der Anrufer,, dass ist, keine externe Grenze überschritten wird.Funktionen genannt, die von anderer Leute code ist davon auszugehen, dass die eingehenden Parameter ungültig und/oder bösartige irgendwann.

Mein Ansatz für den Umgang mit freiliegenden Funktionen ist einfach zu crash, mit eine hilfreiche Nachricht, wenn möglich.Wenn der Anrufer kann Sie nicht Holen Sie sich die Parameter genau dann das problem liegt in Ihrem code, und Sie sollten es lösen, nicht Sie.(Offensichtlich haben Sie Dokumentation zur Verfügung, die für Ihre Funktion ist, da ist es ausgesetzt.)

Code-Injektion ist nur ein Problem, wenn sich Ihre Anwendung ist in der Lage zu heben, die der aktuelle Benutzer.Wenn ein Prozess gelingen kann, code in die Anwendung, dann könnte es ganz einfach den code schreiben, um den Speicher und führen Sie es trotzdem.Ohne in der Lage zu gewinnen vollen Zugriff auf das system-code-injection-Angriffe sind zwecklos.(Dies ist der Grund, warum Anwendungen, die von Administratoren verwendet werden, sollten nicht writeable by lesser-Benutzer.)

In meiner Erfahrung, positiv auf die Beschäftigung defensive Programmierung nicht unbedingt bedeuten, dass Sie am Ende die Verbesserung der Qualität Ihres Codes.Versteh mich nicht falsch, Sie müssen defensiv-Programm, fangen die Arten von Problemen, die Benutzer werden kommen über - Benutzer mögen es nicht, wenn Ihr Programm abstürzt auf Sie - aber dies ist unwahrscheinlich, um den code leichter zu pflegen, test, etc.

Wir haben vor einigen Jahren gemacht-Richtlinie für die Verwendung Behauptungen auf allen Ebenen unserer software und dies - zusammen mit unit-Tests, code-reviews, etc.plus unsere bestehenden Anwendung test-suites - hatte einen signifikanten, positiven Effekt auf die Qualität unseres Codes.

Java, Signiert, Gläser und JAAS.

Java, um Pufferüberlauf zu verhindern und Zeiger/stack whacking nutzt.

Nicht verwenden JNI.( Java Native Interface), es macht Sie zu DLL/Shared-libraries.

JAR zu stoppen laden von Klassen wird ein Sicherheits-problem.

JAAS können lassen Sie Ihre Anwendung nicht Vertrauen Sie niemandem, auch sich selbst.

J2EE hat (zugegebenermaßen begrenzten) built-in-Unterstützung für rollenbasierte Sicherheit.

Es gibt einige overhead für einige dieser aber in die Lücken verschwinden.

Einfache Antwort: Es hängt davon ab,.Zu viel defensive Codierung können verursachen erhebliche performance-Probleme.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top