# Struts - Direktaufruf eines URL verhindern



## synthesist (4. Jan 2007)

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/newEntry.do?action=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/newEntry.do?action=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.


----------



## SlaterB (5. Jan 2007)

'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


----------



## MatthiasKnorr (10. Jan 2007)

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):

```
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


----------



## synthesist (6. Feb 2007)

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.


----------



## KSG9|sebastian (6. Feb 2007)

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.


----------



## MatthiasKnorr (7. Feb 2007)

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


----------



## SlaterB (7. Feb 2007)

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


----------



## synthesist (8. Feb 2007)

ja, deswegen die frage: ist es möglich mit einem normalen Textlink ein post zu senden ? Mein derzeitiger Link sieht so aus:

```
<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/NewEntry.do?action=neuerEintrag&customer_id=7


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

http://localhost:8080/MyApplication/NewEntry.do?action=neuerEintrag&customer_id=7
http://localhost:8080/MyApplication/NewEntry.do?action=neuerEintrag&customer_id=8
http://localhost:8080/MyApplication/NewEntry.do?action=neuerEintrag&customer_id=9
http://localhost:8080/MyApplication/NewEntry.do?action=neuerEintrag&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/NewEntry.do?action=neuerEintrag&customer_id=188574637847234

kann der Nutzer immer noch 

http://localhost:8080/MyApplication/NewEntry.do?action=neuerEintrag&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!


----------



## DreamArtist (9. Feb 2007)

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


----------



## ms (22. Aug 2007)

@synthesist

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


----------



## SnooP (22. Aug 2007)

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.


----------



## byte (22. Aug 2007)

Ein Workaround wäre sowas:


```
<form name="hiddenForm" action="blablub" method="post">
    <input name="foo" value="bar" type="hidden"/>
    [url="#"]Link mit hidden Post[/url]
</form>
```

Funktioniert halt nur, wenn Javascript aktiviert ist.


----------

