Matt: HTTP Refferer: Vor/Zurück

Hallo Selfer,

ein übernommenes PHP-Script soll optimiert und angepasst werden.

Nehmen wir an 'a.php' enthält ein Formular welches bei absenden auf 'b.php' verweist. In 'b.php' werden die Daten in die Session gesichert. 'b.php' enthält auch ein weiteres Formular welches auf 'c.php' verweist. Dort ('c.php') werden alle eingegebenen Formulardaten von 'a.php' & 'b.php' dargestellt.

In 'b.php' werden ja die Daten von 'a.php' in die Session gespeichert. Dies soll aber nur passieren wenn man von 'a.php' auf 'b.php' kommt und nicht wenn ich von 'c.php' mit dem 'Zurück-Button' des Browsers auf 'b.php' komme.

Momentan wird das so geregelt (Auszug aus 'b.php'):

  
if($_SERVER['HTTP_REFERER'] == 'http://www.domain.de/a.php') {  
  // Daten von a.php verwerten  
}  

Nun kann man z.B. in Firefox die Referer abschalten, dann funktionieren die Scripte nicht mehr... was die sich dabei gedacht haben ;-)

Meine Frage bezieht sich nun auf einen geeigneteren Lösungsweg.
z.B. bei dem o.g. Script. Von a.php auf b.php mit einer GET-Variable (action="b.php?edit=true") verweisen und nur wenn diese existiert führe das Script in b.php aus?

Grüße
Matt

  1. Moin!

    In 'b.php' werden ja die Daten von 'a.php' in die Session gespeichert. Dies soll aber nur passieren wenn man von 'a.php' auf 'b.php' kommt und nicht wenn ich von 'c.php' mit dem 'Zurück-Button' des Browsers auf 'b.php' komme.

    Wenn du sowieso eine Session hast, kannst du dir in dieser merken, dass du auf c warst, und in b dann entsprechend reagieren.

    Wie du die Info, dass du auf c warst, wieder rückgängig machst, wenn der Benutzer weitermacht, ist deine Aufgabe. :)

    - Sven Rautenberg

    --
    "Love your nation - respect the others."
    1. Moin!

      In 'b.php' werden ja die Daten von 'a.php' in die Session gespeichert. Dies soll aber nur passieren wenn man von 'a.php' auf 'b.php' kommt und nicht wenn ich von 'c.php' mit dem 'Zurück-Button' des Browsers auf 'b.php' komme.

      Wenn du sowieso eine Session hast, kannst du dir in dieser merken, dass du auf c warst, und in b dann entsprechend reagieren.

      Wie du die Info, dass du auf c warst, wieder rückgängig machst, wenn der Benutzer weitermacht, ist deine Aufgabe. :)

      Du kannst dir auch in a merken, dass du auf a warst, und diese Info in b wieder rückgängig machen.

      - Sven Rautenberg

      --
      "Love your nation - respect the others."
  2. Hallo Matt,

    wie lautet denn nun die Frage? ;-)
    Wie ich das sehe, funktioniert deine Lösung zwar schon, kann aber ziemlich leicht manipuliert werden.

  3. Mahlzeit,

    ein übernommenes PHP-Script soll optimiert und angepasst werden.

    Übernommen? Beileid. Vorschlag: Umstellung auf Affenformular. So "weiß" Dein Skript garantiert immer, wo und wie es sich gerade befindet.

    MfG,
    EKKi

    --
    sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
    1. Übernommen? Beileid. Vorschlag: Umstellung auf Affenformular. So "weiß" Dein Skript garantiert immer, wo und wie es sich gerade befindet.

      Ein Affenformular besteht für mich darin das Formular zigmal aufrufen zu können ohne etwas zu bewirken. Aber wie soll ich beim von mir erläuterten Script dort wissen von "wo" ich komme und "wo" ich mich befinde?

      1. Mahlzeit,

        Aber wie soll ich beim von mir erläuterten Script dort wissen von "wo" ich komme und "wo" ich mich befinde?

        Je nachdem, welche Werte per GET oder POST übergeben wurde? Je nachdem, was der Benutzer eingegeben hat? Je nachdem, welchen Wert versteckte <input>s und/oder Session-Variablen haben?

        MfG,
        EKKi

        --
        sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
  4. Hi,

    Nun kann man z.B. in Firefox die Referer abschalten, dann funktionieren die Scripte nicht mehr... was die sich dabei gedacht haben ;-)

    Der Referrer ist ohnehin (wie alle User-Daten) beliebig manipulierbar. Genauer: Er ist von allen User-Daten sogar derjenige, der *mit Abstand* am häufigsten nicht das enthält, was gutgläubige Programmierer so erwarten!

    Auch ohne Firefox, und mitunter ohne das der Surfer es überhaupt weiß, geschweige denn veranlaßt hat.

    Von a.php auf b.php mit einer GET-Variable (action="b.php?edit=true") verweisen und nur wenn diese existiert führe das Script in b.php aus?

    Z.B.!

    Ich gebe meinen Formularen i.d.R. ein Hidden-Field mit, indem (kodiert) alles drinsteht, was ich an Zusatzinfos brauche (u.a. auch um Spam-Bots und versehentlichem Doppelversand zu begegnen).

    Gruß, Cybaer

    --
    Man kann doch sehr leicht jenen tugendhaften Menschen begegnen, (...) die eine Art "unkrümmbaren Zeigefinger" besitzen, der ständig den kalten Wind des Rechthabens ausströmt. (Wolfgang Huber, Bischof)
    Die Tugend jagt nicht den Teufel, sondern den Sündhaften. Damit wird sie zum Terror. (Hans-Ulrich Jörges, Journalist)
  5. Hi,

    In 'b.php' werden ja die Daten von 'a.php' in die Session gespeichert. Dies soll aber nur passieren wenn man von 'a.php' auf 'b.php' kommt und nicht wenn ich von 'c.php' mit dem 'Zurück-Button' des Browsers auf 'b.php' komme.

    egal wie oft und in wie vielen Varianten die Frage gestellt wird: Es existiert kein Weg zu ermitteln, auf welche Weise ein (eventuell vorhandener) Nutzer zu einer Seite gelangt ist. Der Referer ist zudem nicht nur ein absolut unzuverlässiges Indiz, sondern für diese Angelegenheit bringt er sogar absolut nicht das geringste. Nicht mal unter Laborbedingungen.

    Nun kann man z.B. in Firefox die Referer abschalten, dann funktionieren die Scripte nicht mehr... was die sich dabei gedacht haben ;-)

    An dieser Stelle hat Firefox nichts implementiert, was auch nur im Ansatz ungewöhnlich ist. Seit der Existenz der Netze ist der Referer allerhöchstens optional, sein Inhalt frei wählbar, und gängige Praxis tat auch genau dies.

    Meine Frage bezieht sich nun auf einen geeigneteren Lösungsweg.

    Der Request wird stattfinden. Das ist eine simple Tatsache, gegen die Du weder etwas unternehmen noch sie schönreden kannst. Rechne also jederzeit damit. Der Request wird sich durch nichts unterscheiden, ob er nun per Formularabsendung geschah, per Back-Button, per Reload, per Bookmark[1], Eingabe der URL[1] oder sonstwas[2]. Akzeptiere den Request und verwerte die Daten auf eine Weise, die sinnvoll ist. Hierzu ist das von EKKi Gesagte zielführend.

    Cheatah

    [1] Nun, in diesem Fall fehlen POST-Daten.
    [2] Hier vielleicht auch.

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes