Frage

Ich habe Probleme zu verstehen, warum Java sichere Codierung wichtig ist. Zum Beispiel, warum ist es wichtig, private Variablen zu erklären? Ich meine ich, dass es unmöglich machen, diese Variablen für den Zugriff von außerhalb der Klasse, aber ich konnte einfach die Klasse dekompilieren, um den Wert zu erhalten. In ähnlicher Weise wird eine Klasse als final definiert, macht es unmöglich, diese Klasse zu Unterklasse. Wann wäre eine Klasse sein gefährlich für die Sicherheit Subklassen? Wieder wenn nötig, konnte ich die ursprüngliche Klasse dekompilieren und es mit bösartigem Code neu implementieren, was ich nur wünschen konnte. Kommt das Problem, wenn Anwendungen „trusted“ durch den Benutzer sind? Und die Leute könnten dann irgendwie dieses Vertrauen missbrauchen? Im Grunde, was ich suche ist ein gutes Beispiel dafür, warum sichere Codierung Richtlinien sollten befolgt werden.

War es hilfreich?

Lösung

Die Programmierung ist hart.

Wenn Sie strengen APIs definieren, das belichten keine Variablen, die angeblich nicht ausgesetzt werden (wir möchten diese nennen Verkapselung ), helfen Sie Benutzer Ihrer APIs und somit erleichtern die Programmierung. Dies ist eine gute Sache betrachtet.

Die Gründe dafür sind nicht in erster Linie „Sicherheit“, wie es in geheime Dinge geheim zu halten, so viel wie Klarheit, Einfachheit und Verständlichkeit.

Als Bonus, es ist viel einfacher, die Dinge richtig funktioniert, wenn Sie, dass der Benutzer der API kann nicht wissen, „Ihre“ Variablen hinter dem Rücken, natürlich verändert sich.

Andere Tipps

Es ist „sicher“, was bedeutet, dass eine Klasse internen Arbeits zu werden versteckt wer nutzt es.

Der Begriff sicher ist, wie in „Sichern eines Server“ nicht verwendet wird verwendet, um die Tatsache beabsichtigen, dass ein Benutzer einer Klasse muss sich keine Sorgen darüber, wie die Klasse die Aufgabe durchführen wird er will es.

Unter Ihrem Beispiel:

Variablen einer Klasse freilegen würde den Benutzer Ihrer Klasse Know ihrer Existenz lassen, die etwas, das Sie nicht wollen, zum Beispiel: Sie nur eine Taste drücken, um das Licht einzuschalten, müssen Sie nicht jetzt dass im Innern ist es Kupfer oder whater braucht es die Aufgabe auszuführen.

Java ist ein objektorientierte Programmierung Langauge, und eines der Schlüsselkonzepte in der objektorientierten Programmierung ist Einkapselung .

Die Idee hinter Kapselung ist es, „zu verstecken“ die Implementierungsdetails wie interne Variablen, die den Zustand des Objekts und die internen Abläufe wie Algorithmen halten, und bietet nur eine Schnittstelle, die anderen Objekte, um Funktionen ausführen können mit dem Objekt.

diesen Begriff verwenden, möchte man interne Zustände verstecken, indem private Variablen mit anderen Objekten zu verhindern, dass direkt die internen Zustände zu beeinflussen. In Java ist es üblich, Getter und Setter (z getColor und setColor), um mit Objekten zu arbeiten, um zu sehen.

Auch Kapselung als auch die Robustheit des Codes erhöhen kann.

Zum Beispiel, indem sie den Zugang zu den internen Zuständen zu beschränken, wäre es möglich, einige Integritätsprüfungen durchzuführen, bevor ein Objekt verändert wird.

Als festes Beispiel sagen, dass es ein Score Objekt war, das einen percent Wert zwischen 0 und 100 haben war. Durch ein setPercent(int) Verfahren bereitgestellt wird, das überprüft, ob der angegebene Wert innerhalb des zulässigen Bereichs war, würde es das Score Objekt verhindert in einen inakzeptablen Zustand gesetzt wird.

Also, versucht, direkt den internen Zustand zu manipulieren, indem er eine Anweisung wie score.percent = 150 schreiben könnte verhindert werden, wenn die setPercent Methode einen Fehler verursacht oder wirft eine Exception wenn der angegebene Wert nicht akzeptabel ist.

Es gibt zwei Probleme hier.

Das erste, wenn Variablen als geschützt oder privat zu erklären, werden sie nicht Teil Ihrer öffentlichen API werden. Andere Klassen können in Zukunft von der Klasse abhängig, und es ist wichtig, dass Sie frei sind, so viel wie möglich zu ändern, wenn Sie neue Funktionen enthalten sein sollen, die Leistung zu verbessern, usw. Wenn alle Ihre Werte Öffentlichkeit sind als alle Ihre internen Werte und Mechanismen sind öffentlich. Ändern sie können andere Klassen brechen, die auf Ihnen ab.

Die zweite ist, dass, wenn Variablen Belichten anderen Klassen können Ihre Werte ändern. Wenn sie Ihre internen Werte ändern, wenn Ihr Programm kann brechen, und erstellen seltsames unerwartetes Verhalten. Wenn Sie ein System schaffen, das auf der genauen Leistung einer Klasse beruht, und die inneren Werte geändert werden, als Sie nicht mehr auf diesem System verlassen können. Subclassing macht dies komplizierter. Ihr System kann auf eine Klasse eines bestimmten Typs verlassen erwarteten Aktionen auszuführen. Durch Subklassen ist es möglich, eine neue Klasse zu erstellen, die die gleiche Art zu sein scheint, hat aber nicht die erwarteten Aktionen ausführen.

Zum Beispiel, wenn Sie eine Klasse Quadrat mit einer geschützten Funktion getArea () haben, erwarten Sie, um die Fläche eines Quadrats zurückzukehren. Allerdings kann eine neue Klasse hergestellt werden, die Platz erstreckt, sagen Klasse Rechteck erstreckt Platz. Jetzt können rectange außer Kraft setzen getArea (), aber es ist immer noch vom Typ Platz, der etwas brechen kann, der auf dieser Funktionalität von Platz abhängt. Indem Sie Ihre Klasse final Sie behaupten, dass dies nie in Ihrem System auftreten kann.

Diese Art von „sicherer Codierung“ nicht jemand verhindern, den Quellcode zu sehen, aber es hilft, Ihren Code zuverlässige und verwendbar in der Zukunft zu machen.

Nur um zu dem, was andere gesagt haben schon: Einige dieser Funktionen können auch einfach als eine Möglichkeit angesehen werden, angeben möchten. Wenn ich ein Mitglied private mache ich es „unmöglich“ für andere darauf zugreifen (es ist möglich, aber das ist neben dem Punkt hier), aber noch wichtiger sagen, dass ich die Benutzer, dass dies eine Implementierung Detail, dass sie sich nicht darauf verlassen sollte auf .

nur vorstellen, wenn Ihr Objekt interne Eigenschaft hat, die nicht privat ist (verdeckt) und der Code den Zugriff auf diese Eigenschaft zufällig in Multithreading-Umgebung ausgeführt werden, so dass N Threads beginnen würde es gleichzeitig zugreifen, 5 Fäden möchte diese Eigenschaft ändern , 4 zu lesen. Es gibt keine Möglichkeit, sicher, die Dinge ordentlich laufen wird, wissen weder Thread, welche Daten es im Moment hält und haben es erfolgreich Eigenschaft des Objekts geändert.

Sie müssen spezielles Stück Code programmiert werden, die verantwortlich ist, die synchronen Zugriff zu handhaben und dass nach wie vor wird nicht seinen Code guarrantee richtig funktioniert, da Sie noch Rest von 680 Klassen in Ihrem Programm zu überprüfen, dass die Eigenschaft Zugriff auf nicht Zugriff direkt.

Kurz gesagt, sind Sie in einem großen Problem, und das Debuggen ist ein Alptraum, da Sie nicht wissen, wann die Daten chagned wurde, die Gewinde das täte, von wo es passiert usw.

Nur ein Szenario von dem, was passiert, wenn Sie nicht einkapseln ...

Gute Sache, Ihr Code ausgeführt werden 1% schneller, gibt es weniger Last auf dem Stapel, haben Sie wahrscheinlich vernachlässigbar Performance-Gewinne erzielt, die Sie mit regelmäßigen Abstürzen des Systems und die kleineren Chancen für erfolgreiche Fehlersuche bezahlen.

Der Begriff „sichere Codierung“ bezieht sich auf den Bau von Software, die eindeutig Sicherheitslücken zu vermeiden versucht, ob in C, Java, Ruby, Assemblersprache, oder irgendetwas anderes. Vielleicht ist der zentralste Teil, dass nach einem sicheren Sprachsystem auszuwählen, ist für eine gute Programmierpraktiken zu halten. Wenn ein Programm nicht klar ist, dann haben Sie kaum eine Chance, es verdient jedes Vertrauen zu sein.

Für Java gibt es zwei bemerkenswerte Führer:

In Java gibt es zwei verschiedene Arten der sicheren Codierung.

In einem Sie mit dem Code zu tun, die nicht alle Privilegien haben, die Ihr Code tut. Wenn Sie zum Beispiel eine Bibliothek oder Signierung Code schreiben müssen Sie dies tun. Es sollte nicht möglich sein, Schadcode nutzen Ihre Berechtigungen in ungewollter Weise zu nehmen. Das ist schwierig!

Häufiger Sie mit Programmen handeln, die mit nur nicht vertrauenswürdigen Daten handeln. Zum Beispiel Web-Server (man denke XSS und SQL-Injection) und Desktop-Programme Anwendung mit nicht vertrauenswürdigen Dateien handeln (in der Regel ist das Problem mit C-Code mit Pufferüberlauf - echter C ++ ist besser). In einigen Situationen Denial-of-Service (DoS) kann eine schwere Frage sein.

Es gibt einige Überschneidungen. Zum Beispiel laufen Dolmetscher mit den Berechtigungen des Interpreter-Code und können recht „mächtig“ sein.

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