Struts - Direktaufruf eines URL verhindern

Allgemeines EE: Struts - Direktaufruf eines URL verhindern



Erstellt von synthesist  |  Antworten: 11

  1. #1
    synthesist

    Struts - Direktaufruf eines URL verhindern
    Hallo,
    wie macht man es, dass ein url, der in einem <html:link> einen id Parameter übergeben bekommt, nicht direkt ueber die manuelle Adresseingabe im Browser aufgerufen werden kann, sondern nur über diesen link auf diesen url verweist.

    zb wird jemand über einen link an diese seite geleitet

    http://localhost:8080/projekt/newEnt...ion=new&s_id=1

    momentan ist es so, dass derjenige auch manuell im browser dies eintippen könnte und er würde inhalt sehen, der nicht für ihn bestimmt ist.
    http://localhost:8080/projekt/newEnt...ion=new&s_id=2

    Wie kann ich sowas verhindern, dass Seiten nur über den Link aufgerufen werden können bzw. das der url ein wenig vershclüsselt wird, so dass ein mancher nicht auf die idee kommen könnte urls auszuprobieren und nicht zugewiesenen inhalt sieht ?

    Thanks a lot. Vielen Dank.

  2. #2
    SlaterB

    'ein wenig' verschlüsseln kannst du am einfachsten mit Post-Aufrufen,
    dann fallen die Parameter weg,

    das geht mit einem Link nicht, aber jeden Link kannst du wohl auch als Formular darstellen
    (da ist die Frage, obs nur als Button geht oder auch als Text-Link)

    nur Tipp in die richtige Richtung, keine fertige Lösung

    ------


    auf jeden Fall kann man spätestens mit dem Anschauen des HTML-Quelltextes jeden verwendbaren Link erkennen,
    alles was der Browser können muss, das kann auch der User,

    -------

    auf Serverseite könntest du noch tricksen, indem du für eine bestimmte Session die versendeten Links (oder Ids) merkst und nur diese zulässt,
    wenn andere kommen, dann hat die wohl ein User manuell eingetippt,

    gibt evtl. Probleme, wenn der User in der lokalen History wandert und Links von früheren Seiten aufruft

  3. #3
    MatthiasKnorr


    Hallo,

    du kannst deine Request Information vielleicht auch einfach mit sun.misc.BASE64Encoder oder anders verschlüsseln.
    Dann würde der Link so aussehen (vorher noch mit dem java.net.URLEncoder drüber, wegen dem '=' nach Base64):
    Code:
    http://localhost:8080/projekt/newEntry.do?command=YWN0aW9uPW5ldyZzX2lkPTE%3D
    Das hält wengistens den Hauptteil der Nutzer ab, in der URL rumzufuschen.

    Grüße,
    Matthias

  4. #4
    synthesist

    Hallo,
    leider kriege ich das mit den "post" links überhaupt nicht hin, das scheint wohl nur mit Button Links zu gehen.
    Mathias Knorr, hättest du vielleicht ein Beispiel oder Ansatz wie ich das machen könnte ?

    Vielen Dank im voraus.

  5. #5
    KSG9|sebastian


    der Vorschlag von MatthiasKnorr ist soweit gut. Würd das so lösen, dann haste auch nicht das Problem dass du bei jedem Link per Javascript das Formular posten musst.

  6. #6
    MatthiasKnorr


    Hallo synthesist,

    kannst du bitte kurz erklären (vielleicht mit etwas Code) was du gemacht hast und was daran nicht funktioniert?
    Zur Zeit ist mir nicht klar, was du mit 'Post' oder 'Button' Links meinst.

    Grüße,
    Matthias

  7. #7
    SlaterB

    das kommt doch von meinem Post drüber,

    bei
    <form method = post, action=..
    <submit>
    </form>
    usw. werden die Parameter nicht angezeigt,
    aber zumindest standardmäßig ist Submit ein Button und kein 'normaler' Link

  8. #8
    synthesist

    ja, deswegen die frage: ist es möglich mit einem normalen Textlink ein post zu senden ? Mein derzeitiger Link sieht so aus:
    Code:
     <logic:iterate 
                  id="currententry"                          
                  name="entries"            
                  indexId="i"        
     >  
     <td
        <html:img src="import/list.gif" align="absmidlle"/></td>
    	 <td width="430">
    	     <html:link action="/NewEntry.do?action=neuerEintrag"
    				  			 paramName="currententry"
    				  			 paramProperty="customer_id"
    							 paramId="customer_id"					 
    	     >
    		<bean:write name="currenentry" property="inhalt"/>
    	    </html:link
    </td>	
    
    </logic:iterate>
    Dies führt zu einer Reihe von Links, die nach Anklicken im Browser so aussehen:

    http://localhost:8080/MyApplication/...&customer_id=7


    Und mein Problem ist nun, dass jemand der es darauf anlegt, manuell einfach im Browser eingibt

    http://localhost:8080/MyApplication/...&customer_id=7
    http://localhost:8080/MyApplication/...&customer_id=8
    http://localhost:8080/MyApplication/...&customer_id=9
    http://localhost:8080/MyApplication/...customer_id=13

    usw.

    eingibt, und dadurch unbefugten Inhalt sieht. (Die IDs sind die tatsächlichen Ids wie sie in der Datenbank auch sind).

    Dann habe ich probiert, die Zahl nach der customer_id durch einen Random Long und einer HashMap zu "verschlüsseln", was auch gut funktioniert hat. Doch leider musste ich feststellen, dass auch dies nur eine oberflächliche Sicherheit war. Denn selbst wenn dies im Browser erscheint

    http://localhost:8080/MyApplication/...88574637847234

    kann der Nutzer immer noch

    http://localhost:8080/MyApplication/...&customer_id=2

    manuell eingeben, und nix wars mit den Randoms.

    Dann hab ich mir überlegt, ob es auf DB Ebene eine Möglichkeit gibt, jedesmal einen neuen, zufälligen und eindeutigen Primary Key zu erzeugen. Weiß ich nicht. Weiß auch nicht ob man das so machen würde.

    Jedenfalls suche ich einen Mechanismus,
    - der den Direktaufruf einer Action oder jsp verhindert (ohne alles in WEB-INF 'verstecken' zu müssen)
    - eine andere Lösung für die Parameterübergabe einer Action ?


    Danke nochmal für alle Vorschläge!

  9. #9
    DreamArtist


    Setzt in der Session die ID.
    Dann musst du sie nicht aus dem Request auslesen sondern kannst Sie aus der Session auslesen.
    Und die Session wird kann der User nicht manipulieren

  10. #10
    ms


    @synthesist

    Wozu brauchst du das eigentlich?
    Wenn das dein Berechtigungskonzept für deine User ist, dann überdenke das bitte nochmal.

  11. #11
    SnooP


    wollte ich gerade erwähnen - bevor man sich solche komplexe Pseudo-Verschlüsselungsmaßnahmen überleget, wie wär's, wenn nur User auf Inhalte zugreifen können, die auch nur für sie bestimmt sind? Dann kommt man mit den get-parametern nicht weit, sollte jemand diese manuell verändern.

  12. #12
    byte


    Ein Workaround wäre sowas:

    Code:
    <form name="hiddenForm" action="blablub" method="post">
        <input name="foo" value="bar" type="hidden"/>
        Link mit hidden Post
    </form>
    Funktioniert halt nur, wenn Javascript aktiviert ist.


Keine Antwort auf Deine Suche gefunden? Registriere Dich kostenlos und stelle Deine eigene Frage zu Java!

Jetzt kostenlos registrieren