2012-03-26 108 views
2

我有这个小的PHP脚本,它接受POST变量并将其写入文件。PHP字符串中的百分号

<?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); 
?> 

这似乎是工作的罚款给大多数文本,但在给出包含一个百分号(%)文本的情况下,下面的怪胎出现:

fivice = getField(%bind, 0); 

原文是:

%device = getField(%bind, 0); 

我返回以下服务器要求POST请求:

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 

在许多其他情况下也会出现这种情况,但正如您所看到的,不是使用%绑定。
我找的这个原因,并发现%%的东西,所以我尝试了%% - 逃避者,并得到这个:

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

有什么办法来解决这个问题%?另外,%问题是一个PHP问题或请求问题?

编辑:我试过使用urlencode/urldecode但这些都没有解决问题。这也发生在file_put_contents,所以我开始认为这是一个上传问题。

+1

1.-您正在使用POST变量,没有任何过滤器和测试。 2.什么是getField? – 2012-03-26 20:02:55

+2

此脚本是**严重**安全隐患。 – Halcyon 2012-03-26 20:05:11

+0

@FritsvanCampen:我在其中实现了一个密码,请参阅编辑。它可能不是最安全的事情,但现在我只需要这些。 – 2012-03-26 20:20:52

回答

1

解决它的方法是文本,该文本将转向%%25 URL编码。您需要调查需要编码的位置(或者为什么不首先编码)。

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

事实上,我正在将原始%符号作为“url编码”文本发送到php,然后将%符号解码为fi字符。在通过POST发送文本之前,我最终编码了文本。谢谢! – 2012-03-26 20:47:53

0

您是否可能将urldecode应用于字符串? URL编码的字符看起来像一个百分比,后面跟两个数字,但也许可以是十六进制。 de都是十六进制数字。

%de可能是字符fi。

+0

确实,%de是字符fi。不,我不是urlDecode'字符串。在那里的PHP是我的网站上的确切版本。 – 2012-03-26 20:13:24