Qwald: 'Evil:' urldecode()

Hallo,
jmd. hat mir geschrieben, dass er Probleme mit meinem Script hätte.

Dabei wird ein Base64 codierter String (erforderlich), nochmals per urlencode(); kodiert, um dann per GET übertragen zu werden.

z.B. so:
$text = "Hallo Welt";
$code = urlencode(base64_encode($text));
echo '<a href="?code=$code">Link</a>';

Dann beim Empfangen:
$empf = base64_decode(urldecode($_GET['code']));
echo $empf;

Dabei ist es extrem wichtig, das exakt die gleichen Texte übergeben werden, sprich:
md5($text) == md5($empf);

Eine kleinste Abweichung würde schon einem Fehler hervorrufen.

So jetzt zurück zum Problem. Diese Person meinte, es gäbe immer dann Probleme, wenn ein %-Zeichen übertragen werden soll.

Er hat dann folgendes Statement gefunden:
"
A reminder: if you are considering using urldecode() on a $_GET variable, DON'T!

Evil PHP:

<?php

BAD CODE! DO NOT USE!

$term = urldecode($_GET['sterm']);
?>

"

Nachdem er dann das urldecode+urlencode entfernt hat, funktioniert es beim ihm.

In wie fern ist an diese Statement etwas dran, und wie löst man das Problem am besten?

MFG

  1. Hallo,
    Nachtrag:
    Hier nochmal das Statement: http://de3.php.net/manual/de/function.urldecode.php
    (2. Kommentar).

    Wie löst man denn jetzt am besten mein Problem?

    MFG

    1. Hallo,

      Nachtrag:
      Hier nochmal das Statement: http://de3.php.net/manual/de/function.urldecode.php
      (2. Kommentar).
      Wie löst man denn jetzt am besten mein Problem?

      Das steht doch dort. Lass urldecode($_GET['xyz']) einfach weg. Du brauchst es nicht. Die Inhalte der $_GET Variablen sind bereits automatisch URL-dekodiert worden. Oder musst Du sonst, wenn Du auf $_GET zugreifst irgendwie urldecode() einsetzten? Der Browser sendet Formular-Daten aber _immer_ URL-Kodiert. Das Dekodieren ist also standard. Es ist sogar ein Beispiel angegeben:

      <form action="#" method="get">
      <input type="Text" name="t1" value="" size="10" maxlength="10">
      <input type="Submit" name="OK" value="OK">
      </form>

      Wenn jemand in das Textfeld "t1" die Zeichen %27 eingibt, dann wird dies URL-kodiert als t1=%2527&OK=OK übertragen. Die Variable $_GET['t1'] enthält aber schon wieder dekodiert den String "%27". Ein nochmaliges dekodieren würde demzufolge "'" ergeben.

      viele Grüße

      Axel

  2. Hi,

    In wie fern ist an diese Statement etwas dran, und wie löst man das Problem am besten?

    Ersteres hast Du selbst erfahren, lezteres: Man verzicht in diesem Fall urldecode() (was übrigens *nicht* getdecode() heißt!). =:-)

    Du hast vielleicht Probleme ... =;-)

    Gruß, Cybaer

    --
    Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
  3. Hallo,

    hast Du schon mal einen urlencoded String, dem man das auch ansieht, per URL übertragen und Dir nach dem Empfang angesehen, was in $_GET dafür drinsteht?

    Das würde Dir bestimmt die Augen öffnen. :-)

    LG
    Chris

  4. Hallo,

    Nachdem er dann das urldecode+urlencode entfernt hat, funktioniert es beim ihm.

    Nicht missverstehen, was ich im anderen Posting geschrieben habe. Das urldecode() ist überflüssig für $_GET. Das urlencode() ist _nicht_ immer überflüssig.

    Dass es ohne urlencode() für einen String, der einfach als Queryteil an eine A-href angehängt wird, bei "%" im String unkodiert funktioniert, wage ich zu bezweifeln. Nur bei Form-Submit wird automatisch URL-kodiert. Diesen String muss man schon manuell URL-kodieren. Das dekodieren ist dann wieder automatisch, weil der Server keine Chance hat am HTTP-GET-Request zu erkennen, ob der von einem Formular oder von einem Link kommt.

    viele Grüße

    Axel

    1. echo $begrüßung;

      [...] der Server keine Chance hat am HTTP-GET-Request zu erkennen, ob der von einem Formular oder von einem Link kommt.

      Wie kann denn der Server bei anderen Request-Arten erkennen, was die Datenquelle ist? Wie kann der denn ermitteln, ob die Request-Daten beispielsweise aus irgendeiner HTML-Gegebenheit entstammen oder sonstwie zusammengestellt wurden?

      echo "$verabschiedung $name";

      1. Hallo,

        [...] der Server keine Chance hat am HTTP-GET-Request zu erkennen, ob der von einem Formular oder von einem Link kommt.

        Wie kann denn der Server bei anderen Request-Arten erkennen, was die Datenquelle ist?

        Du meinst Die Quelle des Requests? Den Begriff Datenquelle kenne ich im Zusammenhang HTTP-Request nicht.

        Wie kann der denn ermitteln, ob die Request-Daten beispielsweise aus irgendeiner HTML-Gegebenheit entstammen oder sonstwie zusammengestellt wurden?

        Das kann er nicht. Wer hat etwas anderes behauptet?

        viele Grüße

        Axel

        1. echo $begrüßung;

          [...] der Server keine Chance hat am HTTP-GET-Request zu erkennen, ob der von einem Formular oder von einem Link kommt.

          Wie kann denn der Server bei anderen Request-Arten erkennen, was die Datenquelle ist?
          Du meinst Die Quelle des Requests? Den Begriff Datenquelle kenne ich im Zusammenhang HTTP-Request nicht.

          Der Request wird von irgend einem Client abgesetzt. Die Stelle von der dieser die zu übermittelnden Daten nimmt, die meinte ich mit Datenquelle.

          Wie kann der denn ermitteln, ob die Request-Daten beispielsweise aus irgendeiner HTML-Gegebenheit entstammen oder sonstwie zusammengestellt wurden?
          Das kann er nicht. Wer hat etwas anderes behauptet?

          Ja, direkt behauptet hat es keiner. Doch deine obige Aussage ließ die Vermutung offen, dass es vielleicht bei den anderen Request-Arten ginge. Und damit sich keiner falsche Hoffungen macht, wollte ich mit meiner Frage eine Klarstellung provozieren. Haken dran.

          echo "$verabschiedung $name";