Warum brauchen wir Sicherheit auf Methodenebene?

14

Warum müssen wir in der realen Welt Sicherheit auf Methodenebene implementieren?

Wir haben entweder eine Webanwendung oder eine Desktopanwendung, bei der der Benutzer auf die Benutzeroberfläche zugreift (und daher nicht direkt auf die Methode zugreifen kann).

Wo kommt hier der direkte Zugriff auf Methoden ins Bild?

Bearbeiten: Ich stelle diese Frage, weil ich mit Spring-Sicherheit experimentiere und Benutzer zum Zugriff auf Methoden autorisiere.

etwas wie :

 @ROLE_ADMIN
public void update() {
      //update
}
Vinoth Kumar CM
quelle
1. Code wiederverwenden, ohne über Sicherheitsprobleme nachzudenken 2. sich leicht in einen Webservice integrieren 3. über Sicherheit sicher sein, wenn Sie den Sicherheitsmechanismen der oberen Schichten nicht vertrauen
Erkan Erol

Antworten:

23

In einer richtig gestalteten Anwendung sind das Backend und das Frontend nicht verbunden. Das Backend-Sicherheitssystem kann nicht davon ausgehen, dass ein bestimmtes Frontend die Sicherheit korrekt handhabt, und muss sie daher selbst handhaben.

jwenting
quelle
Sie haben die Frage nicht beantwortet: Warum Methodenebene?
Codism
@Codism - Er hat darauf geantwortet. B / c können Sie nichts annehmen. Sie führen die Berechtigungsprüfung auf Methodenebene b / c durch, unabhängig davon, wie jemand dorthin gekommen ist. Sie müssen sicherstellen, dass er die richtigen Rechte hat.
Joseph Lust
@JosephLust: Die Antwort und Ihr Kommentar können auf jedes Sicherheitssystem auf jeder anderen Ebene angewendet werden. In der ursprünglichen Frage wurde speziell gefragt, warum dies auf Methodenebene der Fall ist.
Codism
1
Weil es die niedrigste verfügbare Stufe ist und mit AOP oder AspectJ problemlos angewendet werden kann. Ich glaube nicht, dass dies für alle anderen Sicherheitsimplementierungen gilt.
Joseph Lust
5

Ich gehe davon aus, dass Sie über den rollenbasierten Zugriff auf Aktionen in einem Controller sprechen. Dh in einer MVC-Architektur ist jede Methode in einer ControllerKlasse eine separate Aktion. Bei den meisten von mir verwendeten MVC-Frameworks kann ich Berechtigungen sowohl auf Methoden- als auch auf Klassenebene zuweisen. Das würde bedeuten, dass ich ein Attribut / eine Anmerkung auf Klassenebene anwenden kann und die entsprechende Rolle für jede Aktion in diesem Controller erforderlich wäre.

Beachten Sie im Hinblick auf eine differenziertere Steuerung des rollenbasierten Zugriffs Folgendes:

  • Es ist praktisch, alle Aktionen um eine Ressource herum zu gruppieren. Dh Ihre CRUD-Aktionen (Create / Read / Update / Delete) für Artikel, Konten usw. Dies erleichtert das Schreiben und Verwalten von APIs im REST-Stil.
  • Viele Systeme verfügen über andere Berechtigungsnachweise / Rollen, die für Aktionen zum Erstellen / Aktualisieren / Löschen erforderlich sind als für Leseaktionen.
  • Wenn sich alle Benutzerkontenaktionen auf einem Controller befinden, möchten Sie jedem die Anmeldung gestatten, aber nur bestimmten Personen, neue Konten zu erstellen oder Rollen zuzuweisen.

Als Ruby on Rails vor einigen Jahren auf Sendung ging, kopierte fast jedes MVC-Framework seinen grundlegenden Designansatz. Früher waren Aktionen separate Klassen, aber die Aktionslogik ist in der Regel klein und fokussiert, sodass ein vollständiger Klassen-Overhead übertrieben ist. Das Zuordnen einer Methode auf einem Controller zu der Aktion für eine Seite ergab tatsächlich einen großen Sinn. Wissen Sie nur, dass viele Menschen eine genaue Kontrolle darüber benötigen, welche Rollen welche Funktionen ausführen können.

Berin Loritsch
quelle
3

Sicherheit auf Methodenebene ist aus zwei Hauptgründen nützlich:

  • als weitere Sicherheitsebene (zusätzlich zu anderen Ebenen)

  • In Fällen, in denen es bequemer oder logischer ist, über Berechtigungen auf Methodenebene zu verfügen, wird ein Fall in Betracht gezogen, in dem verschiedene Benutzer dieselben "direkten" Aktionen ausführen können (damit die Client-Sicherheit nicht relevant ist). In einigen Fällen kann ihre Aktion jedoch ein Verhalten auslösen, das Sie einschränken möchten. In diesem Fall kann die Sicherheit auf Methodenebene eine relevante Lösung sein.

Ophir Yoktan
quelle
0

Mike Wiesner erinnerte in dieser SpringSource-Präsentation, Introduction to Spring Security 3 / 3.1 , an das Beispiel, dass Tomcat und viele andere Servlet-Container einen Fehler hatten, der "../" nicht richtig erkannte, wenn er in Unicode codiert war Ein einfacher Gleichheitstest schlägt in Java fehl, wird jedoch in das übergeordnete Verzeichnis im Dateisystem übersetzt.

Sicherheit ist hart, mehrere Sicherheitsstufen verbessern die Chancen, Umgehungsversuche zu blockieren. Da die Sicherheit auf Methodenebene direkt in der Klasse codiert ist, rufen Sie nach der AOP-Erweiterung beim Aufrufen der Methode die Sicherheitsüberprüfung immer vorher auf.

stivlo
quelle
-2

Ich nehme an, dass Sie hier über öffentliche, private und geschützte Methoden sprechen?

Wenn ja, dann existieren sie nicht zum Zweck der Sicherheit. Sie dienen dazu, die Modularisierung der Software zu vereinfachen oder zu gewährleisten. (Ob ihnen das gelingt, werde ich anderen überlassen. Das ist jedoch die Vision, wofür sie da sind.)

Angenommen, ich liefere eine Bibliothek aus, dann kann ich später eine andere Version der Bibliothek ausliefern und als privat markierte Inhalte so oft ändern, wie ich möchte. Hätte ich dieses Zeug dagegen nicht als privat markiert, könnte ich keine Interna meiner Software ändern, da wahrscheinlich irgendwo jemand direkt darauf zugreift. Sicher, theoretisch liegt es an ihnen, dass sie die dokumentierte API nicht verwenden. Aber der Kunde wird es als meine Schuld ansehen, dass mein Software-Upgrade seine Software beschädigt hat. Sie wollen keine Ausreden, sie wollen, dass es behoben wird. Wenn ich ihnen jedoch zunächst keinen Zugriff gewähre, entspricht meine API genau den öffentlichen Methoden, die ich als meine API festlegen wollte, und das Problem wird vermieden.

Das zweitwahrscheinlichste, worüber Sie sprechen könnten, ist das Sicherheitsmodell von Java. Wenn Sie darüber sprechen, dann bestand der Grund dafür darin, dass die ursprüngliche Vision für Java darin bestand, dass Leute möglicherweise nicht vertrauenswürdige Applets sendeten, um interaktiv in Programmen von Drittanbietern (z. B. Browsern) zu arbeiten. Daher sollte das Sicherheitsmodell den Benutzern einen gewissen Schutz vor böswilligen Applets bieten. Daher besteht die Sicherheitsbedrohung darin, dass nicht vertrauenswürdige Applets versuchen, mit anderer Software zu interagieren, die möglicherweise geladen ist.

btilly
quelle
2
du hast es nicht verstanden, er redet nicht über öffentlich, privat und geschützt, sondern darüber zu prüfen, ob ein Benutzer eine Rolle bei AOP hat oder nicht
stivlo