2012-03-26 17 views
2

Ich habe dieses kleine PHP-Skript, das eine POST-Variable nimmt und in eine Datei schreibt.Prozentzeichen in PHP Strings

<?php 
    $fileContents = $_POST["Contents"]; 
    $fileName = $_POST["Name"]; 
    $filePath = $_POST["Path"]; 

    $passcode = $_POST["Passcode"]; 

    if ($passcode != "<passcode>") 
     die(); 

    if (!is_dir("./upload/$filePath")) 
     mkdir("./upload/$filePath", 0755, true); 

    $file = "./upload/$filePath" . $fileName; 

    $fd = fopen($file, "w"); 
    fwrite($fd, $fileContents); 
    fclose($fd); 
?> 

Dies scheint gegeben für die meisten Text gut zu funktionieren, aber in dem Fall, in dem Text ein Prozentzeichen (%) enthält, gegeben wird, tritt die folgende Kuriosität:

fivice = getField(%bind, 0); 

Der ursprüngliche Text war:

%device = getField(%bind, 0); 

ich schicke die POST-Anforderung mit der folgenden Serveranfrage:

POST path/to/Upload.php HTTP/1.1\nHost: host.com\nContent-Type: application/x-www-form-urlencoded\nContent-Length: <length>\n\n<file data>\n 

Dies tritt auch bei vielen anderen Fällen auf, aber, wie Sie sehen können, nicht mit% bind.
Ich suchte nach der Ursache dieser und etwas auf %% gefunden, so habe ich versucht, eine %% - escaper und bekam dies:

%fivice = getField(%%bind, 0); 

Gibt es eine Möglichkeit, dieses% Problem zu beheben? Ist das% -Problem ein PHP-Problem oder ein Anforderungsproblem?

Edit: Ich habe versucht mit urlencode/urldecode, aber diese beide konnten das Problem nicht beheben. Dies ist auch bei file_put_contents aufgetreten, also denke ich, dass es ein Upload-Problem ist.

+1

1.- Sie verwenden POST-Variablen ohne Filter oder Test. 2.- Was ist 'GetField'? –

+2

Dieses Skript ist ein ** ernsthaftes ** Sicherheitsrisiko. – Halcyon

+0

@FritsvanCampen: Ich habe einen Code implementiert, siehe die Änderungen. Es ist vielleicht nicht die sicherste Sache, aber es ist alles, was ich wirklich für jetzt brauche. –

Antwort

1

Der Weg, um es zu beheben, ist URL-Codierung des Textes, der % in %25 wird. Sie müssen jedoch untersuchen, wo es codiert werden muss (oder warum es nicht an erster Stelle codiert wird).

>>> u'fi'.encode('macroman') 
'\xde' 
+0

Tatsächlich schickte ich die rohen% -Zeichen als "url-kodierten" Text an den php, der wiederum die% -Zeichen in fi-Zeichen decodierte. Ich habe den Text vor dem Senden über POST verschlüsselt. Vielen Dank! –

0

Wenden Sie vielleicht eine urldecode auf die Zeichenfolge an? URL-codierte Zeichen sehen wie ein Prozentsatz aus, gefolgt von zwei Zahlen, aber möglicherweise können diese hexadezimal sein. d und e sind beide hexadezimale Zahlen.

% de könnte das Zeichen fi sein.

+0

Tatsächlich ist% de das Zeichen fi. Und nein, ich bin nicht in der Lage, die Zeichenfolge zu dekodieren. Das php da oben ist die genaue Version auf meiner Seite. –