关于PHP异或运算不可靠性的分析

网络整理 - 08-10
细节分析:

  在正常情况下,通过PHP上传文件,需要通过is_uploaded_file函数来判断文件是否是通过HTTP POST上传的,这可以用来确保恶意的用户无法欺骗脚本去访问本不能访问的文件,例如/etc/passwd。

  而最近遇到一个问题:在利用MooPHP的一个项目中,接到用户反馈说其所有客户不能上传文件,都返回失败,经过排查发现是is_uploaded_file函数在捣鬼。本来应该是C:WINDOWSTempphp99.tmp这样的tmp_name,却变成了C:WINDOWSTempphp99.tmp这种,导致is_uploaded_file函数返回错误的信息。

  处理方式:

  在加上如下代码后,问题解决。

  $file['tmp_name'] = str_replace(’’, ‘’, $file['tmp_name']);

  注意,“”实际字符串就是两个,其他两个是用来表示转义的。

  深入研究:

  为什么在默写特定的环境下会出现这种情况呢,我们来看如下分析:

  ; Magic quotes for incoming GET/POST/Cookie data.

  magic_quotes_gpc = On

  在PHP的默认配置中magic_quotes_gpc是On的,而打开了magic_quotes_gpc参数的PHP环境会自动对GET/POST/Cookie添加addslashes效果。注意,并不会为$_FILES添加addslashes效果。

  而当magic_quotes_gpc是Off的时候,由于为$_FILES数组添加了addslashes作用,反而出现了问题。也就在magic_quotes_gpc是Off的PHP环境下都会出现此问题。

  顺带说句,SVN上的MooPHP代码已经修复此问题。

  is_uploaded_file函数解析:

  判断文件是否是通过HTTP POST上传的

  bool is_uploaded_file ( string $filename )

  如果filename所给出的文件是通过HTTP POST上传的则返回TRUE。这可以用来确保恶意的用户无法欺骗脚本去访问本不能访问的文件,例如/etc/passwd。 这种检查显得格外重要,如果上传的文件有可能会造成对用户或本系统的其他用户显示其内容的话。

  为了能使is_uploaded_file()函数正常工作,必段指定类似于$_FILES['userfile']['tmp_name']的变量,而在从客户端上传的文件名$_FILES['userfile']['name']不能正常运作。