Web PHP: Redirect kommt mit '&' nicht klar!

Dieses Thema im Forum "Programmierung" wurde erstellt von Elrontur, 29. Juni 2013.

  1. Elrontur
    Offline

    Elrontur Ehem. Teammitglied

    Registriert seit:
    5. April 2013
    Beiträge:
    138
    Minecraft:
    Elrontur
    Hi minecraft-server.eu-Community,

    ich wende mich mal an euch mit einer Bitte.
    Ich will, dass mein PHP-Redirect funktioniert - und zwar komplett... :D

    So sieht erstmal der Code aus:
    PHP:
    1. <?php
    2.   if(isset($_GET['r'])) {
    3.     $redirect = htmlentities($_GET['r']);
    4.    
    5.     echo "<h1>Weiterleitung</h1>
    6.          Du verlässt <b>&raquo;Rontu&laquo;</b> gleich, um eine externe Website zu besuchen!
    7.          Ich, Elrontur, übernehme keine Verantwortung für die externe Seite oder dessen Inhalte. <br>
    8.          Bist du nicht einverstanden damit, kannst du diese Seite verlassen und dich wieder meiner Seite widmen.
    9.          Wenn du damit einverstanden bist, dann klicke auf den Link:
    10.          <ul>
    11.            <li> <a href=\"$redirect\">$redirect</a>
    12.          </ul>
    13.          <b>ZURZEIT IST DER <i>REDIRECT</i> BEI LINKS MIT '&' DEFEKT! DIES TUT MIR LEID...</b>";    
    14.   } else {
    15.     echo "<h1>Es wurde kein Weiterleitungs-Ziel gefunden!</h1>
    16.          Probiere den Link nocheinmal aus.
    17.          Falls dies nicht helfen sollte, gib die URL direkt im Browser ein!
    18.          (Oben in der Browseradresse zu finden)";  
    19.   }
    20. ?>
    Das wird dann z.B. da eingesetzt:
    HTML:
    1. <a href="index.php?p=1&r=http://www.mozilla.org/de/firefox/fx/" target="_blank">Mozilla Firefox</a>
    Gefixt werden müsste, dass der Code mit den '&'-Zeichen klarkommt und den Inhalt nach den '&' dementsprechend "anzeigt"...

    Alternativ könnte es eine alternative Methode geben, bei der PHP alle Links mit 'index.php?p=1&r=' und der folgenden Adresse abfängt.
    Dann wird der Link nach dem 'index.php?p=0&r=' mit urlencode(); umgewandelt.
    Das wird der Redirect-Page weitergegeben und einfach dort mit urldecode(); wieder in den Normalzustand versetzt.
    Wie das jedoch gehen könnte, weiß ich rein garnicht!

    Danke für jede Hilfe,
    Elrontur
     
    #1
  2. Hecke29
    Online

    Hecke29

    Ich verstehe ehrlich gesagt das Problem nicht?
    Was muss mit dem '&' in der URL passieren? Das ist einfach eine Aneinanderreihung von GET-Parametern...

    Edit: Achso, falls die URL auf die du weiterleitest ein '&' enthält. Ich verstehe... Ich denk mal drüber nach
     
    #2
  3. Benni1000
    Offline

    Benni1000 Ehem. Teammitglied

    Registriert seit:
    4. Mai 2012
    Beiträge:
    1.408
    Mein lösungsvorschlag wäre es die URL einfach in einen base64 string zu verwandeln.
     
    #3
  4. Elrontur
    Offline

    Elrontur Ehem. Teammitglied

    Registriert seit:
    5. April 2013
    Beiträge:
    138
    Minecraft:
    Elrontur
    Eigentlich sollte ja urlencode(); ausreichen.
    Ist das eine bessere Variante mit dem base64?

    Und wie krieg ich es hin, das PHP sich die URLs selbst heraussucht, denn ich will nicht jedem Link irgendsoeine PHP-Funktion reinhauen. :D
    (Sagen wir mal, zu faul dafür...)
     
    #4
  5. Benni1000
    Offline

    Benni1000 Ehem. Teammitglied

    Registriert seit:
    4. Mai 2012
    Beiträge:
    1.408
    Ok ich sehe das Problem das du hast.
    Ich habe eine Lösung entwickelt die funktioniert und anscheinend ist sie auch relativ XSS sicher ist:

    Code (Text):
    1.  
    2. <?php
    3.  
    4.  
    5. $pos = strpos($_SERVER['REQUEST_URI'], "/url/");
    6.  
    7.  
    8. if ($pos !== FALSE) {
    9.     $url = substr($_SERVER['REQUEST_URI'], $pos + 5);
    10.     if (filter_var($url, FILTER_VALIDATE_URL)) {
    11.         echo "Klicke hier um weiter zu kommen: <a href='$url' >$url</a>";
    12.     } else {
    13.         die("INVALID URL");
    14.     }
    15. } else {
    16.     die("INVALID URL");
    17. }
    18.  

    Das legst du in einer einzelnen PHP Datei ab z.b redirect.php, und die links müssen dann so aussehen:
    Code (Text):
    1. http://deinhoster.com/redirect.php/url/[COLOR=#ff0000]http://weiterleitungsurl.de/?q=es geht[/COLOR]
     
    #5
  6. Elrontur
    Offline

    Elrontur Ehem. Teammitglied

    Registriert seit:
    5. April 2013
    Beiträge:
    138
    Minecraft:
    Elrontur
    Danke Benni1000! :)
    Deine Variante, auch wenn verändert, funktioniert.

    Ich habe sie so umgebastelt und funktioniert nun mit meinen Links. :D
    PHP:
    1. <?php
    2.   if(isset($_GET['r'])) {    
    3.     $pos = strpos($_SERVER['REQUEST_URI'], "&r=");
    4.  
    5.     if ($pos !== FALSE) {
    6.         $url = substr($_SERVER['REQUEST_URI'], $pos + 3);
    7.         if (filter_var($url, FILTER_VALIDATE_URL)) {
    8.             echo "<h1>Weiterleitung</h1>
    9.                  Du verlässt <b>&raquo;Rontu&laquo;</b> gleich, um eine externe Website zu besuchen!
    10.                  Ich, Elrontur, übernehme keine Verantwortung für die externe Seite oder dessen Inhalte. <br>
    11.                  Bist du nicht einverstanden damit, kannst du diese Seite verlassen und dich wieder meiner Seite widmen.
    12.                  Wenn du damit einverstanden bist, dann klicke auf den Link:
    13.                  <ul>
    14.                    <li> <a href=\"$url\">$url</a>
    15.                  </ul>";
    16.         } else {
    17.           die("<h1>Das Weiterleitungs-Ziel ist keine gültige Webadresse!</h1>
    18.                Probiere den Link nocheinmal aus.
    19.                Falls dies nicht helfen sollte, gib die URL direkt im Browser ein!");
    20.         }
    21.     } else {
    22.       die("<h1>Das Weiterleitungs-Ziel ist leer!</h1>
    23.          Probiere den Link nocheinmal aus.
    24.          Falls dies nicht helfen sollte, gib die URL direkt im Browser ein!");
    25.     }
    26.   } else {
    27.     die("<h1>Es wurde kein Weiterleitungs-Ziel angegeben!</h1>
    28.        Probiere den Link nocheinmal aus.
    29.        Falls dies nicht helfen sollte, gib die URL direkt im Browser ein!");
    30.   }
    31. ?>
     
    #6