Suche Konzept: Korrektheit des Aufrufers feststellen

SimProtect

Aktives Mitglied
Hallo zusammen,
Ich wende mich heute mit einem vielleicht etwas abstrusen Problem an Euch.
Ich wurde heute mit einer Nutzeranfrage konfrontiert, die ein älteres System betrifft (das in Kürze ersetzt werden soll).

Zur Grundthematik
Es handelt sich um ein agentenbasiertes Simulationssystem, bei welchem die einzelnen aktiven Simulationsentitäten (Agenten) verschiedene Aktionen ausführen können. Hat sich ein Agent für eine Aktion (z.B. eine Bewegung) entschieden, so fragt er bei einem ActionHandler nach, ob diese Aktion ausgeführt werden kann. Dieser ActionHandler führt dann entweder diese Aktion aus oder lehnt sie ab. Der Agent wird darüber über eine Response informiert und kann bei Bedarf entsprechend darauf reagieren.

Zur Problematik
Besagter Nutzer hat nun beklagt, dass der Aufruf am ActionHandler nicht abgesichert sei. Gemäß API übernimmt die Methode die Bewegungsanfrage und eine Entität, die als Anfragesteller angenommen (!) wird (Sprich: Ein Agent übergibt seinen Bewegungswunsch und sich selbst).
Nicht abgesichert bedeuetet in diesem Falle aber, dass der Agent jedoch auch einen x-beliebigen anderen Agenten übergeben könnte, für welche andere Bewegungsregeln gelten
(Konstruiertes Beispiel: Agent A ist eine Turmfigur beim Schach; A stellt eine Bewegungsanfrage, übergibt jedoch den Agenten B, der eine Springerfigur darstellt - somit könnte sich A die Bewegungsroutine von B erschleichen.

Man möchte jetzt vielleicht fragen, warum das ein Problem ist. (das war auch meine erste Überlegung) - immerhin sagt die Dokumentation der API ganz deutlich, was erwartet wird und auch was die Konsequenzen einer Falschangabe sind. Ein Designer, der bewusst diese Regeln verletzt, muss theoretisch auch mit den Konsequenzen leben. Aber nun gut: Es könnte ja auch ein fehlerhafte Aufruf besagter Methode sein, der somit unbemerkt bliebe.

Ich weiß auch nicht, warum die entsprechende Design-Entscheidung damals so getroffen wurde.

Meine Frage
Hat Jemand eine Idee für mich, wie dieser simple Aufruf abgesichert werden könnte?

Architekturtechnisch ist es so, dass die Methoden des ActionHandler public sind - also von jeder Implementierung eines Agenten aufgerufen werden könnten. Eine reine Zusammenfassung der Methode in einer abstrakten Oberklasse ist also hier nicht zielführend.

Aufgrund von möglichen Kompatibilitätsproblemen ist eine Anpassung der API des Handlers kritisch zu betrachten (gerade in Anbetracht der Tatsache, dass das Projekt ohnehin ersetzt werden soll)

Nun ist die Frage, ob ich irgendwie die Identität des Aufrufers sicher stellen bzw. überprüfen kann? (dem besagten Nutzer reicht es, wenn in diesem Fall z.B. eine Exception fliegt)

Alternativ: Gibt es eine Möglichkeit, den entsprechenden Methodenparameter quasi automatisch zu injecten? Also, dass man die Methode nur mit einem Parameter (der Bewegungsanfrage) aufruft und dann beispielswiese das aufrufende Objekt automatisch einsetzt?

Oder hat jemand vielleicht noch eine andere Idee, die ich jetzt gar nicht im Hinterkopf habe?
 

Flown

Administrator
Mitarbeiter
Das was du hier forderst, ist unsinnig. HIER hast du eventuell so was ähnliches, dass du wünscht.

Ich greif jetzt dein Beispiel auf und habe ein Adapter Pattern, dass mir vorgaukelt ein Turm zu sein, aber eigentlich ein Bauer ist.
Was hindert den Adapter daran, jetzt seine Aktionen an den Bauern zu delegieren (ala Wolfs im Schafspelz). Nichts! Denn der Handler sieht den Turm, überprüft die Identität, aber Züge macht der Bauer.

Also ist es unsinnig solche Abfragen überhaupt zu wollen, selbst wenn ich eine Methode schreiben würde:
Java:
public static double pi() {
  return 3d;
}
ist es die Verantwortung des Programmierers.
Oder sehe ich die Fragestellung falsch?
 

mrBrown

Super-Moderator
Mitarbeiter
extenden die Agenten eine bestimmte Oberklasse? Dann könnte man in dieser die Methode implementieren, die den Handler aufruft, und darin this übergeben. Der wirkliche Agent ruft dann diese Methode ohne this auf.


Allerdings: Wenn Turm A Bauer B übergibt, warum führt der Handler dann überhaupt die Methode mit Turm A aus, er kennt ja nur Bauer B?
 

Flown

Administrator
Mitarbeiter
Alternativ: Gibt es eine Möglichkeit, den entsprechenden Methodenparameter quasi automatisch zu injecten? Also, dass man die Methode nur mit einem Parameter (der Bewegungsanfrage) aufruft und dann beispielswiese das aufrufende Objekt automatisch einsetzt?
Du injectest den Caller schon automatisch, wenn du this mitlieferst. Selbst solche automatischen Injektionen können "getürkt" werden.
 

SimProtect

Aktives Mitglied
extenden die Agenten eine bestimmte Oberklasse? Dann könnte man in dieser die Methode implementieren, die den Handler aufruft, und darin this übergeben. Der wirkliche Agent ruft dann diese Methode ohne this auf.


Allerdings: Wenn Turm A Bauer B übergibt, warum führt der Handler dann überhaupt die Methode mit Turm A aus, er kennt ja nur Bauer B?

Ja, sie erben letztlich von der AbstractAgent-Klasse. Allerdings behebt ein hineinziehen in diese Klasse nicht das Grundproblem: Die Schnittstelle des ActionHandlers ist public. Somit kann trotzdem an der API "vorbeigeschossen" werden (der Aufruf kann immer noch manuell erfolgen.

Zum zweiten Punkt: Oh, entschuldigung, das hatte ich nicht richtig beschrieben. Es gibt pro Simulation EINEN ActionHandler - nicht pro Agent. Jeder ActionHandler ist dabei eine Implementierung des IActionHandler-Interfaces und beschreibt unterschiedliche Arten, wie die Simulation auf Aktionen reagiert. Grundgedanke war damals (so die Architekturdokumentation), dass man auch asychrone Simulationen verwalten kann. Jeder Agent kann dabei seine Berechnungen durchführen, während die übrigen Agenten dies auch tun. So kann es dazu kommen, dass ein Agent zu lange braucht und seine getroffene Entscheidung nicht mehr möglich ist (z.B. weil eine Koordinate bereits durch einen anderen Agenten blockiert ist).
Der ActionHandler war in diesen Fälle nicht nur dazu da, die Aktionen der Agenten auszuwerten und zu bewerten, sondern war auch gleichzeitig der Scheduler für die Aktionen (Reihenfolge usw.)

Du injectest den Caller schon automatisch, wenn du this mitlieferst. Selbst solche automatischen Injektionen können "getürkt" werden.
Hier geht es eher darum, dass ein Entwickler (=Nutzer des Frameworks) einen falschen Parameter einträgt (anstatt this einen Agenten in der Sichtweite des "this"-Agenten(sorry, für diese Beschreibung)).
Ursprünglich war angedacht, dass es diese Möglichkeit gibt, um die Simulationsdesigner nicht in ihrer Kreativität einzuschränken.
Nun möchte ein Nutzer jedoch, dass es diese Möglichkeit nicht mehr gibt. Problem für ihn war: Ein versehentlich falsch eingetragener Wert führt zu falschen Simulationsergebnissen (hierbei wurden Aktionen von falschen Agenten ausgeführt und andere Agenten haben Bewegungen ausgeführt, die für sie eigentlich nicht erlaubt waren) - ein solches Problem stellt aber (aktuell) keinen Fehlerfall dar. Die Logik wird normal ausgeführt, weshalb so ein Fehler eher zufällig auffällt und auch entsprechend schwer zu finden ist. Nach Meinung des Nutzers reicht ein Kommentar in der Dokumentation der API nicht aus - er hätte das gerne technisch abgesichert.
 

mrBrown

Super-Moderator
Mitarbeiter
Ja, sie erben letztlich von der AbstractAgent-Klasse. Allerdings behebt ein hineinziehen in diese Klasse nicht das Grundproblem: Die Schnittstelle des ActionHandlers ist public. Somit kann trotzdem an der API "vorbeigeschossen" werden (der Aufruf kann immer noch manuell erfolgen.
Mit Reflection kann sowieso jede Methode aufgerufen werden, aber zumindest die Wahrscheinlichkeit von zufälligen Fehlern ist so seltener.

Zum zweiten Punkt: Oh, entschuldigung, das hatte ich nicht richtig beschrieben. Es gibt pro Simulation EINEN ActionHandler - nicht pro Agent. Jeder ActionHandler ist dabei eine Implementierung des IActionHandler-Interfaces und beschreibt unterschiedliche Arten, wie die Simulation auf Aktionen reagiert. Grundgedanke war damals (so die Architekturdokumentation), dass man auch asychrone Simulationen verwalten kann. Jeder Agent kann dabei seine Berechnungen durchführen, während die übrigen Agenten dies auch tun. So kann es dazu kommen, dass ein Agent zu lange braucht und seine getroffene Entscheidung nicht mehr möglich ist (z.B. weil eine Koordinate bereits durch einen anderen Agenten blockiert ist).
Der ActionHandler war in diesen Fälle nicht nur dazu da, die Aktionen der Agenten auszuwerten und zu bewerten, sondern war auch gleichzeitig der Scheduler für die Aktionen (Reihenfolge usw.)

Hab ich auch so verstanden, meine Frage zielte auf was anderes ab ;)

Noch mal zu dem Schachbeispiel: Turm A ruft den ActionHandler mit seiner neuen Position (zu der er nicht gehen darf) auf, und übergibt Bauer B, damit er sich trotzdem dahin bewegen darf. Was macht denn dann der Handler damit?
Gibt der Handler einfach nur true zurück, und der Turm macht den Rest (dann könnte der Turm das ja ignorieren)?
Oder setzt der Handler selbst dann den Turm auf die neue Position (kann der Handler ja nicht, er denkt ja, der Bauer bewegt sich)?

Hier geht es eher darum, dass ein Entwickler (=Nutzer des Frameworks) einen falschen Parameter einträgt (anstatt this einen Agenten in der Sichtweite des "this"-Agenten(sorry, für diese Beschreibung)).
Ursprünglich war angedacht, dass es diese Möglichkeit gibt, um die Simulationsdesigner nicht in ihrer Kreativität einzuschränken.
Nun möchte ein Nutzer jedoch, dass es diese Möglichkeit nicht mehr gibt. Problem für ihn war: Ein versehentlich falsch eingetragener Wert führt zu falschen Simulationsergebnissen (hierbei wurden Aktionen von falschen Agenten ausgeführt und andere Agenten haben Bewegungen ausgeführt, die für sie eigentlich nicht erlaubt waren) - ein solches Problem stellt aber (aktuell) keinen Fehlerfall dar. Die Logik wird normal ausgeführt, weshalb so ein Fehler eher zufällig auffällt und auch entsprechend schwer zu finden ist. Nach Meinung des Nutzers reicht ein Kommentar in der Dokumentation der API nicht aus - er hätte das gerne technisch abgesichert.
Siehe meinen ersten Punkt, da hätte man solche Fehler nicht mit drin (außer der Nutzer ignoriert den richtigen Weg, könnte man verhindern, wenn der Handler für die nicht abstrakten Agenten nicht sichtbar ist (zur Not bräuchte man ein zweites Interface)). Gegen gewolltes falsch benutzen (uU mit Reflection) kann man aber nicht wirklich was tun.
 

SimProtect

Aktives Mitglied
Es geht hier tatsächlich eher um zufällige Fehler. Via Reflection könnte ein Entwickler sowieso so gut wie alles aushebeln. Relativ einfach kann so ein Fehler entstehen, wenn zuvor vielleicht an dieser Stelle eine Methode aufgerufen wurde, die einen anderen Agenten zum Ziel hatte. Etwas falsch gemacht beim Refactoring und schon ist der Fehler da.
Wenn jemand z.B. via Reflection an vorgegebenen Constraints vorbeischießt, dann ist das in meinen Augen kein Fehler unseres Frameworks mehr, wenn's dann knallt.

Zum ActionHandler
Die eigentliche Bewegung (oder auch eine Aktion) wird durch den ActionHandler ausgeführt bzw. geplant. Die Agenten selbst dürfen - in diesem Framework - selbst keine Aktionen durchführen, sondern dürfen nur freundlichst anfragen, ob sie denn dürfen.
Der Response des ActionHandlers dient dazu, dass der Agent ggf. darauf reagieren kann, wenn der Handler sagt: "Nö, darfste nicht" oder "Nö, darfste nicht, WEIL...".

Das Problem hierbei ist, dass die vorliegenden ActionHandler alle so implementiert sind, dass sie die Constraints aus den übergebenen Parametern ableiten und danach handeln. Daher wird der jeweilige Agent auch mit übergeben.
Beispiel:
Agent A fragt eine Bewegung an, übergibt aber Agent B. Der ActionHandler würde nun die Constraints von B prüfen und die Bewegung auch für Agent B ausführen. Das führt zu zweierlei Problemen:
-> Agent A führt seinen geplanten Zug niemals aus;
-> Agent B gelangt ggf. in einen inkonsistenten Zustand. Er befindet sich beispielsweise gerade selbst noch in der Entscheidungsfindungsphase, kann jedoch keine gültige Entscheidung mehr treffen, weil er faktisch nicht mehr auf seiner Position ist (dies aber noch "glaubt"). B würde in dieser - wie gesagt älteren Architektur - auch nicht über diese Änderung informiert werden. Dies würde nur geschehen, wenn tatsächlich eine Aktion gegen ihn gerichtet worden wäre (dann wäre er sofort informiert worden und würde ggf. seine Entscheidungsfindung anpassen oder abbrechen).

Zu Deinem letzten Vorschlag:
Wir haben auch schon überlegt, die Referenz zum ActionHandler in der abstrakten Klasse private zu machen und die Aufrufe darüber laufen zu lassen. Aus irgendeinem Grunde haben wir das heute früh verworfen - allerdings weiß ich gerade peinlicherweise nicht mehr warum... oh man. Vielleicht ist es heute einfach zu spät.
 

mrBrown

Super-Moderator
Mitarbeiter
Den Aufruf des Handers in Code verlagern, der dann vom Nutzer nicht noch mal angefasst wird, dürfte imho die einfachste Lösung sein.

Alle anderen dürften ziemlich große Änderungen am Code erfordern, die Kapselung des Aufrufs kann man wenn nötig auch ohne jegliche Änderung der API erreichen (zur Not hat der abstrakte Agent zwei Handler-Instanzen, die echte und eine, die der implementierte Agent zu sehen bekommt. In der sichtbaren wird dann einfach nur der passende Agent gesetzt und der sichtbare aufgerufen, und der übergebene Agent weggeschmissen)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Suche nach String mit unbekannten characters Allgemeine Java-Themen 53
M Binäre Suche Allgemeine Java-Themen 6
M geometrische Suche Allgemeine Java-Themen 8
S Programm schreiben, das mir aufgrund von Schlagwörtern, die ich im Internet suche, relevante Themen sofort anzeigt. Allgemeine Java-Themen 1
I HTML / XHTML Seite nach Excel exportieren. Suche Lib Allgemeine Java-Themen 12
White_Fox Suche Ursache für NPE - woher kommt sie? (Hilfe beim Debugging) Allgemeine Java-Themen 19
White_Fox Collections Suche Collection, um Strings mit Indizees versehen Allgemeine Java-Themen 47
O Suche Scripter für alt:V Project! Allgemeine Java-Themen 0
D Suche Quellcode! Allgemeine Java-Themen 8
O Suche Unterstützung für ein OpenSource-Projekt (grafischer Editor) Allgemeine Java-Themen 13
B Bei Email: FW / AW... - Hilfe bei String suche Allgemeine Java-Themen 21
J Suche Alternative zu Jasper Reports Allgemeine Java-Themen 4
White_Fox Collections Suche etwas Sorted-List-Artiges...hat jemand eine Idee? Allgemeine Java-Themen 13
M Suche Alternative zu JFreeChart Allgemeine Java-Themen 11
S Warmup für Lineare-Suche mit Zeitmessung Allgemeine Java-Themen 2
K OOP Suche Hilfe + Erklärung für eine Hausaufgabe Allgemeine Java-Themen 1
B Suche nach einem Testprogramm für meine BA Allgemeine Java-Themen 0
D Objekt-Suche mit mehreren optionalen Parametern Allgemeine Java-Themen 6
A NetBeans Suche Programmierer für eine Belegarbeit Allgemeine Java-Themen 11
O Suche größeres Beispiel für WebserverAnwendung mit Java Allgemeine Java-Themen 2
G Google-Suche ist nicht auslesbar?! Allgemeine Java-Themen 18
M Suche aktuelle Apache Poi Bibliothek zum Einbinden in mein Programm Allgemeine Java-Themen 2
L Suche nach CalDav Server API Allgemeine Java-Themen 0
HarleyDavidson Best Practice Suche "Container" für Modulapplikationen Allgemeine Java-Themen 0
KaffeeFan Methoden Suche Methode um Programm kurz warten zu lassen Allgemeine Java-Themen 22
B Suche geeignete Datenstruktur Allgemeine Java-Themen 5
L Erste Schritte Suche Java Wiki System? Allgemeine Java-Themen 5
L Suche Geräte für Java SE Embedded Allgemeine Java-Themen 0
S Rekursive Suche in einem Netz Allgemeine Java-Themen 5
F Über Java Google Suche nutzen Allgemeine Java-Themen 11
A Suche Android Programmierer Allgemeine Java-Themen 0
W Suche Framework zur Prüfung von IPv4 und IPv6 Allgemeine Java-Themen 2
A Java - Suche nach Datensatz mit DateChooser Allgemeine Java-Themen 0
S Pattern.Match Suche: For Schleife einbinden und in Liste schreiben Allgemeine Java-Themen 3
M Suche Framework/API für Monitoring-Anwendung Allgemeine Java-Themen 3
F Suche kostenlose GUI für Eclipse Allgemeine Java-Themen 10
H Suche mit Wildcards und boolschen Operatoren Allgemeine Java-Themen 4
B Suche passende Datenstruktur für 2 Einträge Allgemeine Java-Themen 19
A Binäre Suche im Array mit StackOverflowError Allgemeine Java-Themen 3
T Verkettete Suche Allgemeine Java-Themen 6
S RxTx - langsame Port suche Allgemeine Java-Themen 3
D Suche Matrix Libraries Allgemeine Java-Themen 11
S Suche Dependency Injection Container Allgemeine Java-Themen 6
J Suche: Tool zum Auffinden gleichnamiger Klassen (Name und Package gleich) in unteschiedlichen JARs Allgemeine Java-Themen 5
BinaryLogic Input/Output Suche Wörterbuch-Datei Einzahl/Mehrzahl Allgemeine Java-Themen 2
A Suche Algorithmus zum Erstellen eines planaren Graphen Allgemeine Java-Themen 5
D Suche Librarys ähnlich datatables.net + Login Allgemeine Java-Themen 3
Gossi Threads Suche ein (einfaches) Beispiel Allgemeine Java-Themen 5
P Erste Schritte Suche in ArrayList mit Maps Allgemeine Java-Themen 4
F Suche Performanceoptimierung bei Stringsortierung Allgemeine Java-Themen 51
B Suche Datenquelle für lizenz-informationen Allgemeine Java-Themen 5
J Lucene suche in Json (CouchDB) Allgemeine Java-Themen 2
X Suche Softwareimplementierung von Cryptographischen Algorithmen Allgemeine Java-Themen 3
S Suche Tipps für Einstieg in JavaCC Allgemeine Java-Themen 2
R Suche in logfiles mit Lucene / Solr Allgemeine Java-Themen 2
P Suche Datenstruktur Allgemeine Java-Themen 2
M Suche Java-Projekt zum Thema Elektrotechnik Allgemeine Java-Themen 6
F Suche Begriff Allgemeine Java-Themen 2
hdi Suche Icon-Sammlung Allgemeine Java-Themen 7
G Suche "richtiges" Framework/Library Allgemeine Java-Themen 14
slawaweis Suche Klassen für Event Managment und Time Allgemeine Java-Themen 2
P Probleme mit wikipedia quellcode zur binären Suche Allgemeine Java-Themen 6
C Suche Permutationsalgo Allgemeine Java-Themen 6
E Suche nach Foto-Dummy Allgemeine Java-Themen 8
B Suche Paket zum auslesen von Metadaten von Bildern. Allgemeine Java-Themen 4
N suche globale Tastenabfrage Allgemeine Java-Themen 6
P SUCHE: gute Geo Library (freeware) Allgemeine Java-Themen 2
P Suche performante PDF Library Allgemeine Java-Themen 20
data89 Bilder mit Java prüfen - suche dringend Hilfe Allgemeine Java-Themen 8
faetzminator Regex zur Suche von "value-losen" Attributen in HTML Tags Allgemeine Java-Themen 7
S Suche im JTree nach Neuaufbau Allgemeine Java-Themen 4
W Problem bei der Suche (binarySearch) vom deutschen Sonderzeichen "ß" im einem Array Allgemeine Java-Themen 6
D Suche nach passender Datenstruktur Allgemeine Java-Themen 4
S suche library die diagramme darstellen kann Allgemeine Java-Themen 2
T Suche Anhaltspunkt für plattformübergreifende, "unique machine id" ... Allgemeine Java-Themen 12
P WebSerive Suche Allgemeine Java-Themen 15
hdi Suche nach Begriff aus der Programmierung Allgemeine Java-Themen 11
X Suche Java Klasse die Feiertage berechnen kann Allgemeine Java-Themen 2
B suche Deutsche Übersetzung für neuste Eclipse Version Allgemeine Java-Themen 6
Daniel_L Suche nach ganzen Wörtern (wholeword) in Strings? Allgemeine Java-Themen 4
G Regex-Suche nach Worten Allgemeine Java-Themen 3
Antoras Suche Projektarbeit für Gruppe mit 3 Leuten Allgemeine Java-Themen 5
G Perfomante Suche in grosser Datei Allgemeine Java-Themen 6
T Suche Tool Allgemeine Java-Themen 11
D Suche sowas wie Map nur für mehrere Werte Allgemeine Java-Themen 13
D Suche Hilfe zum Rechnerübergreifenden Dateizugriff. Allgemeine Java-Themen 3
M suche speziellen Sortieralgorithmus Allgemeine Java-Themen 3
E javax.comm: Suche eine open source Alternative zu rxtx Allgemeine Java-Themen 8
J Suche regex-Pattern fuer Liste von Zahlen zwischen 0-100 Allgemeine Java-Themen 6
T Suche den großen Calendar Thread ! Allgemeine Java-Themen 2
P Suche Benis IP/Netzwerkadresse JTExtField Allgemeine Java-Themen 2
J Suche Doku um generischen Code zu erstellen. Allgemeine Java-Themen 9
G suche Property alternative Allgemeine Java-Themen 4
C Fehler im Quellcode. Suche in einem Baum Allgemeine Java-Themen 3
S Suche Pendant zu einem VB Befehl Allgemeine Java-Themen 2
T Suche gute JAVA Steuerelemente Allgemeine Java-Themen 2
V Suche RegEx zu (gelöstem) Problem Allgemeine Java-Themen 3
B Suche Browser-Control Allgemeine Java-Themen 4
G Suche Programmierumgebung mit Appletviewer Allgemeine Java-Themen 16
G Suche kostenlosen c++ to java converter. Allgemeine Java-Themen 3

Ähnliche Java Themen


Oben