Linuchs: Ressourcen nur an bestimmte Webseiten ausliefern

Hallo,

Wie kann ich erreichen, dass bestimmte Ressourcen nur an bestimmte Webseiten ausgeliefert werden?

Beispiel:

Bei Eingabe eines Städtenamens werden per Ajax Vorschläge von der Datenbank geliefert. Dieser "Service" kann z.Z. von jeder fremden Webseite abgegriffen werden und erhöht die Server-Belastung.

Ich möchte, dass die Ajax-Routine nur an bestimmte Webseiten antwortet. Zunächst dachte ich an den $_SERVER['REMOTE_HOST'], aber der wird nicht (immer) gesendet.

Gruß, Linuchs

  1. hi,

    Ich möchte, dass die Ajax-Routine nur an bestimmte Webseiten antwortet. Zunächst dachte ich an den $_SERVER['REMOTE_HOST'], aber der wird nicht (immer) gesendet.

    Also ich hab mir dafür ganz einfach die $_SESSION genommen. Nur quasi "eingeloggt" ist, bekommt die Antworten. Geht natürlich auch mit einem bestimmten String im Cookie. Denke das die 2 Dinge dir als Anstoß ausreichen!

    Gruß Niklas

    --
    Man muss nicht alles wissen, man sollte aber wissen, wo das nicht gewusste zu finden ist.
    1. Meine Herren,

      Also ich hab mir dafür ganz einfach die $_SESSION genommen. Nur quasi "eingeloggt" ist, bekommt die Antworten. Geht natürlich auch mit einem bestimmten String im Cookie. Denke das die 2 Dinge dir als Anstoß ausreichen!

      Die Parameter lassen auch faken. Imho. ist das kein sicherer Weg. Die einzige und wohl sehr ernüchterne Antwort die ich geben kann, ist den Fall der Rechtsabteilung zu überlassen.

      --
      Hey Girl,
      i wish you were asynchronous, so you'd give me a callback.
      1. hi,

        Meine Herren,

        Also ich hab mir dafür ganz einfach die $_SESSION genommen. Nur quasi "eingeloggt" ist, bekommt die Antworten. Geht natürlich auch mit einem bestimmten String im Cookie. Denke das die 2 Dinge dir als Anstoß ausreichen!

        Die Parameter lassen auch faken. Imho. ist das kein sicherer Weg. Die einzige und wohl sehr ernüchterne Antwort die ich geben kann, ist den Fall der Rechtsabteilung zu überlassen.

        Wohl etwas übertriebene Maßnahme ...
        Zudem gibt es bei Cookies (welche ja auch bei Sessions im einsatz sind) die Beschränkung auf Domains. Würde man von der fremden Seite zugreifen, würde das Cookie nicht von der Richtigen Seite gesetzt und somit vom Browser nicht mitgesendet. Zwar keine Volle sicherheit, dürfte aber schon einschränken.

        Will man es übertreiben, könnte man noch die IP der Anfragenden beim ersten Aufruf der Seite speichern und bei den AJAX-Anfragen dagegen prüfen. Ich glaub aber, dass einige Maßnahmen mehr Last bringen, als Sie dann wirklich vermeiden.

        Gruß Niklas

        --
        Man muss nicht alles wissen, man sollte aber wissen, wo das nicht gewusste zu finden ist.
        1. Zudem gibt es bei Cookies (welche ja auch bei Sessions im einsatz sind) die Beschränkung auf Domains. Würde man von der fremden Seite zugreifen, würde das Cookie nicht von der Richtigen Seite gesetzt und somit vom Browser nicht mitgesendet. Zwar keine Volle sicherheit, dürfte aber schon einschränken.

          Nein, der Cookie kommt ja gerade von der Seite, die die API zur Verfügung stellt und nicht von der anfragenden Seite.

          Will man es übertreiben, könnte man noch die IP der Anfragenden beim ersten Aufruf der Seite speichern und bei den AJAX-Anfragen dagegen prüfen. Ich glaub aber, dass einige Maßnahmen mehr Last bringen, als Sie dann wirklich vermeiden.

          Das wäre eine Möglichkeit, wenn man sich sicher sein kann, die die IP-Adressen der Server statisch sind oder zumindest nur selten ändern.

          1. hi,

            Zudem gibt es bei Cookies (welche ja auch bei Sessions im einsatz sind) die Beschränkung auf Domains. Würde man von der fremden Seite zugreifen, würde das Cookie nicht von der Richtigen Seite gesetzt und somit vom Browser nicht mitgesendet. Zwar keine Volle sicherheit, dürfte aber schon einschränken.

            Nein, der Cookie kommt ja gerade von der Seite, die die API zur Verfügung stellt und nicht von der anfragenden Seite.

            Eben und das wäre die Hürde für die fremde Webseite!

            Will man es übertreiben, könnte man noch die IP der Anfragenden beim ersten Aufruf der Seite speichern und bei den AJAX-Anfragen dagegen prüfen. Ich glaub aber, dass einige Maßnahmen mehr Last bringen, als Sie dann wirklich vermeiden.

            Das wäre eine Möglichkeit, wenn man sich sicher sein kann, die die IP-Adressen der Server statisch sind oder zumindest nur selten ändern.

            Es geht um die Clients und die haben bei AJAX normalerweise keine festen IPs (also ich glaub zumindest, dass keiner AJAX nutzt um Server zu Server Verbindungen zu machen ;) )

            Gruß Niklas

            --
            Man muss nicht alles wissen, man sollte aber wissen, wo das nicht gewusste zu finden ist.
            1. Meine Herren,

              hi,

              Zudem gibt es bei Cookies (welche ja auch bei Sessions im einsatz sind) die Beschränkung auf Domains. Würde man von der fremden Seite zugreifen, würde das Cookie nicht von der Richtigen Seite gesetzt und somit vom Browser nicht mitgesendet. Zwar keine Volle sicherheit, dürfte aber schon einschränken.

              Nein, der Cookie kommt ja gerade von der Seite, die die API zur Verfügung stellt und nicht von der anfragenden Seite.
              Eben und das wäre die Hürde für die fremde Webseite!

              Nein, der Cookie kann einfach aus dem HTTP-Response [w3c] gelesen werden. Wo ist das Porblem?

            2. Es geht um die Clients und die haben bei AJAX normalerweise keine festen IPs (also ich glaub zumindest, dass keiner AJAX nutzt um Server zu Server Verbindungen zu machen ;) )

              Okay, ich habe hier unter der falschen Annahme geantwortet, dass die fremden Webserver die API proxien. Davon war aber nie Rede. In dem tatsächlich vorliegen Fall wird dann aber auch kein IP-White- oder -Blacklsing zielführend sein.

      2. હેલો

        Die Parameter lassen auch faken.

        Alles lässt sich faken, die frage ist, wie darauf reagiert wird.

        બાય

        --
         .
        ..:
    2. Hallo Niklas,

      Also ich hab mir dafür ganz einfach die $_SESSION genommen. Nur quasi "eingeloggt" ist, bekommt die Antworten. Geht natürlich auch mit einem bestimmten String im Cookie. Denke das die 2 Dinge dir als Anstoß ausreichen!

      Also Cookie fällt weg, weil meine Seiten auch ohne Cookies laufen sollen. Und $_SESSION wäre ja nur dann sinnvoll, wenn die Anfrage an denselben Server geht. Das ist nicht zwingend.

      Mhh ... Korrektur: Die Ajax-Anfrage des Browsers DARF nur an denselben Server gehen (Same-Origin-Policy).

      Also können Fremdseiten gar nicht per Ajax anfragen (es sei denn, der Browser ist "geknackt"). Und ich kann diesen Service gar nicht befreundeten Seiten zur Verfügung stellen.

      Grübel ...

      Linuchs

      1. Mhh ... Korrektur: Die Ajax-Anfrage des Browsers DARF nur an denselben Server gehen (Same-Origin-Policy).

        Doch inzwischen geht das [wikipedia].

      2. Also können Fremdseiten gar nicht per Ajax anfragen (es sei denn, der Browser ist "geknackt"). Und ich kann diesen Service gar nicht befreundeten Seiten zur Verfügung stellen.

        Ahso, wenn Du den Service befreundeten Seiten zur Verfügung stellen willst, geht das natürlich so nicht. Du brauchst eben irgendeine Art Authentifizierung. Zum Beispiel: Du und Dein befreundeter Server einigt auch auf einen Code, der per URL mitgesendet wird und ausgewertet wird. Weiterhin könnte sich dieser Code über die Zeit ändern. Nach einer Vorschrift, die eben Zeitabhängig ist, die aber nur ihr kennt.

        Beispiel (nicht getetsted):
        $Code = md5(date("yzH")."password"); // wechselt stündlich: Z.B md5(1315517."password")

        Bei "password" könntest Du diesen Algorithmus noch etwas individualisieren.

        Du müsstest stets den aktuellen und den Code der letzten Stunde zulassen, damit es beim Stundenwechsel nicht zu unschönen Ablehnungen kommt.

        Cheers,
        Baba

        1. Beispiel (nicht getetsted):
          $Code = md5(date("yzH")."password"); // wechselt stündlich: Z.B md5(1315517."password")

          Keine schlechte Idee, bisher die vielversprechendste, nennt sich übrigens Salt [wikipedia].

          1. Keine schlechte Idee, bisher die vielversprechendste, nennt sich übrigens Salt [wikipedia].

            Jetzt habe ich den selben Fehler wieder begangen. Das Salzen wäre in der Tat eine Möglichkeit, wenn man die API einem kleinen Kreis zugänglich machen würde, man also eine Whitelist führen würde. Der Fall ist aber nicht gegeben, jeder Besucher der eigenen Seite, sollte ja im Stande sein, die eigene API zu nutzen.

            --
            Hey Girl,
            i wish you were asynchronous, so you'd give me a callback.
        2. hi,

          Ahso, wenn Du den Service befreundeten Seiten zur Verfügung stellen willst, geht das natürlich so nicht. Du brauchst eben irgendeine Art Authentifizierung. Zum Beispiel: Du und Dein befreundeter Server einigt auch auf einen Code, der per URL mitgesendet wird und ausgewertet wird. Weiterhin könnte sich dieser Code über die Zeit ändern. Nach einer Vorschrift, die eben Zeitabhängig ist, die aber nur ihr kennt.

          Beispiel (nicht getetsted):
          $Code = md5(date("yzH")."password"); // wechselt stündlich: Z.B md5(1315517."password")

          Bei "password" könntest Du diesen Algorithmus noch etwas individualisieren.

          Du müsstest stets den aktuellen und den Code der letzten Stunde zulassen, damit es beim Stundenwechsel nicht zu unschönen Ablehnungen kommt.

          Da würde ich persönlich noch etwas wie die ersten 2-3 Blöcke der IPv4 dazu nehmen um es an den Client zu binden. Dann kann kein fremder Server sich den code holen auf seiner seite verwenden usw. Weil genau solche Spielereien denke ich mir ab und an aus ... (Server1 frägt Server2 nach code, gibt diesen dem Client und der Client schickt dann die Anfrage an den 2. Server => Schutz geknackt => also IP oder so etwas einbeziehen)

          Gruß Niklas

          --
          Man muss nicht alles wissen, man sollte aber wissen, wo das nicht gewusste zu finden ist.
  2. Ich möchte, dass die Ajax-Routine nur an bestimmte Webseiten antwortet. Zunächst dachte ich an den $_SERVER['REMOTE_HOST'], aber der wird nicht (immer) gesendet.

    Ich habe dazu zwei Mechanismen im Einsatz (die gerne noch bewertet werden können):

    1. Ich vergleiche den HTTP_REFERER in _SERVER mit SERVER_NAME:
      if(isset($_SERVER['HTTP_REFERER'])) $Referer = parse_url($_SERVER['HTTP_REFERER']);  
      else                                $Referer = array('host' => "");  
      
      // ignore actions when hosts differ  
      if(($Referer["host"] != $_SERVER['SERVER_NAME']) and (!empty($this->Action))){  
      
      } 
    

    wie man sehen kann musst Du das noch abwandeln. In $this->Action habe ich die URL GET Parameter, also wird die Abfrage nur ausgeführt, wenn GET-Parameter im Spiel sind, sonst würde der erste Request auch schon abgelehnt werden.

    1. Ich setze im Hauptscript eine Session Variable mit einer ID, übergebe diese per Get dem Ajax-Request, starte dort auch eine Session und vergleiche Wert aus SESSION mit Wert aus GET. Achtung: wenn das Script rechenintensiv ist, Session wieder beenden, sonst ist der Prozess nicht asynchron!!!

    Wie kann ich erreichen, dass bestimmte Ressourcen nur an bestimmte Webseiten ausgeliefert werden?

    ... an bestimmte Klienten ausgeliefert werden ... !

    Cheers,
    Baba

  3. Mach es wie Facebook!
    Es gibt zwei Komponenten. Eine ID und ein Secret. Beide müssen erstmal übermittelt werden. Als Antwort erhält man einen AccessToken der nur eine bestimmte Zeit gültig ist. Dann kann man Anfragen machen.

    Wenn die Anfragen von einem Webserver erwünscht sind, könnte man auch über das abgleichen einer IP nachdenken. Die sollte immer die selbe sein.

    Gruß
    Anfragenberechtiger
    T-Rex