# [PHP] Wie feststellen, dass das Script vom selben Server aus aufgerufen wurde?



## Tobias (20. Apr 2009)

Hi,

ich habe ein Script in PHP geschrieben, das ein wenig nützliche Arbeit verrichtet, dafür aber auch ordentlich Serverressourcen frisst. Nun möchte ich sicherstellen, dass dieses Script nur über meinen eigenen Server aufgerufen wird (weil der Benutzer dann die mit meiner Werbung versehene Eingabemaske passiert).

Kann ich das? Und wenn ja wie?

mpG
Tobias


----------



## Gast2 (20. Apr 2009)

Moin,

kannst Du das bitte nochmal etwas genauer erläutern?

danke, mogel


----------



## Roar (20. Apr 2009)

Du könntest z.B. in einem anderen script mit define() eine konstante definieren, dann dein richtiges php script mit require() einbinden und dort überprüfen ob die konstante gesetzt wurde (defined()).


----------



## Tobias (20. Apr 2009)

@mogel: Ich habe ein Script, das über GET-Parameter seine Eingangsdaten erhält und anschließend sein Ergebnis als HTML-Seite an den Aufrufer zurückschickt. Dieses Script frisst Serverressourcen, die ich durch Werbung finanziere. Um zu verhindern, dass ein Mitbewerber mein Script per Hotlinking mißbraucht, brauche ich einen Weg um herauszufinden, ob das Skript durch ein Formular auf meinem Server aufgerufen wurde oder von außerhalb - Die Werbung findet sich nämlich primär auf der Eingabe-, nicht so sehr auf der Ergebnisseite.

@Roar: Der Vorschlag ist gut, ABER:

Ich habe mir gerade überlegt, das ich das Skript meinen Mitbewerbern einfach als REST-Webservice zur Verfügung stellen kann. Dann brauche ich für die Abrechnung aber einen Weg, um den aufrufenden Server zweifelsfrei identifizieren zu können - Username+Password geht ja nicht, da braucht man ja nur die URL kopieren um auf Kosten eines anderen zu arbeiten. Jemand eine Idee?

mpG
Tobias


----------



## Roar (20. Apr 2009)

Wenn die benutzer den service von ihrer website/ihren servern aus aufrufen bekommt ja niemand anderes die URL/den benutzernamen/den "api key" mit. Zusätzlich solltest du noch die IP und datum mitspeichern für die abrechnung.


----------



## newcron (21. Apr 2009)

du kannst auch folgendes Machen: Du bietest ein zweites Webservice an, von dem die Benutzer einen einmal gültigen Zufalls String (ich nenne ihn mal $key) zurückbekommen so etwas wie sha1(rand()) und eine Session-Id bekommen (die beiden müssen unterschiedlich sein).

Um nun dein tatsächliches Webservice zu verwenden, müssen sie sich nun mit einem String Authentifizieren (ich nenne ihn mal authToken), der in etwa folgendes Format hat: sha1($username.$password.$key)
die Request-URL wäre dann also http://www.du.de/webservice.php?authToken=wfuw4rfkdjhlq98234zr2fdjaskfwfur23&parameter1=...

Serverseitig musst du nun nichts weiter tun, als den Benutzer heraussuchen, bei dem sha1($username.$password.$key) den gleichen String ergibt. Dadurch, dass sha1 eine Hashfunktion ist, ist sie nicht reversibel. Da diese Funktion darüberhinaus noch einen zufalls-string enthält, ist sie nur einmal gültig. 

Die Methode ist der von Remember The Milk angelehnt. Guck mal hier, da beschreiben sie das prinzip recht gut: Remember The Milk - Services / API / User Authentication


----------



## Tobias (21. Apr 2009)

Naja, für jeden Request eine datensatzweise Suche nach dem richtigen Benutzer durchzuführen, ist vielleicht ein bißchen aufwendig. Aber die Methodik, die bei Remember the Milk beschrieben wird, ist gut. Das kann ich benutzen.

Danke an alle Beteiligten.

mpG
Tobias


----------

