PHP字符串中的百分比符号

时间:2012-03-26 19:57:16

标签: php post escaping fwrite

我有一个小的PHP脚本,它接受一个POST变量并将其写入文件。

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

在许多其他情况下也会出现这种情况,但正如您所看到的,不是使用%bind 我寻找原因并在%%上找到了一些东西,所以我尝试了一个%% - escaper并得到了这个:

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

有没有办法解决这个%问题?此外,%问题是php问题还是请求问题?

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

2 个答案:

答案 0 :(得分:1)

解决问题的方法是对文字进行网址编码,然后将%转换为%25。您需要调查它需要编码的位置(或者为什么它首先不编码)。

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

答案 1 :(得分:0)

您是否可以在字符串中应用urldecode? URL编码字符看起来像一个百分比后跟两个数字,但也许那些可以是十六进制。 de都是十六进制数字..

%de可能是字符fi。