PHP字符串中的百分号

3
我有一个小的 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 );

The original text was:

%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。
我寻找了原因,并在%%上找到了一些东西,所以我尝试了一个%%-转义器并得到了这个结果:

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

有没有办法修复这个%问题?此外,百分号问题是php问题还是请求问题?

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


1
  1. 您正在使用未经过滤或测试的POST变量。
  2. getField是什么?
- Nicolás Ozimica
3
这个脚本是一个严重的安全隐患。 - Halcyon
@FritsvanCampen:我已经实现了一个密码功能,详见编辑部分。这可能不是最安全的方式,但目前来说这已经完全够用了。 - Glenn Smith
@Nicolás,“getField”只是正在上传的文本中的代码。 - Glenn Smith
2个回答

1
修复此问题的方法是对文本进行URL编码,这将把%转换为%25。您需要调查它需要被编码的位置(或者为什么一开始没有被编码)。
>>> u'fi'.encode('macroman')
'\xde'

事实上,我将原始的百分号作为“url编码”的文本发送到php,然后php将百分号解码为fi字符。最终我在通过POST发送文本之前对其进行了编码。谢谢! - Glenn Smith

0

你可能正在对字符串应用urldecode吗?URL编码的字符看起来像一个百分比符号加上两个数字,但这些数字可能是十六进制的。de都是十六进制数。

%de可能是字符fi。


确实,%de 是字符 fi。不过,我没有对字符串进行 urlDecode。上面的 PHP 代码就是我网站上的精确版本。 - Glenn Smith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接