防止Content-Disposition“filename”中的绝对文件路径

时间:2012-05-31 18:07:35

标签: c++ forms cgi filenames content-disposition

我有一个简单的HTML表单

<form id="uploadForm" method="post" action="/cgi-bin/test.cgi" enctype="multipart/form-data">
   <input type="submit" name="add_something" value="add">
   <input size="50" type="file" name="myFile" accept="application/zip">
</form>

此外,我通过检查用户浏览器区域设置或搜索自设语言会话cookie在服务器端进行一些网页本地化。

如果我使用

上传文件
  • 铁18.0.1050.0
  • Opera 11.64.1403
  • Firefox 3.6.27
  • Firefox 12.0
  • Google Chrome 19.0.1084.52
  • SeaMonkey 2.9.1

一切正常。但是如果我用

上传文件
  • IE 9.0.8112.16421
  • Maxton 3.3.8.3000

本地化失败。我在HTTP请求中检测到了问题:

Opera 11

Content-Disposition: form-data; name="myFile"; filename="ziptest.zip"
Content-Type: application/zip

和IE 9

Content-Disposition: form-data; name="myFile"; filename="C:\Documents and Settings\m1krsch\Documents\Now Some Spaces\ziptest.zip"
Content-Type: application/x-zip-compressed

如果我从路径中删除空格,那么在IE和Maxton中一切正常。

我可以交换使用过的cgicc库,因为它是项目的固定部分,也不能强迫用户使用没有空格的路径。我该如何规避这个问题?有没有办法强制IE / Maxton使用文件名而不是abolute文件路径?或者我可以在cgi / env中设置一个特定参数来阻止传输abolute文件路径吗?

[编辑] 我发现这是IE和Maxton中的安全问题。 IE的安全区域模型默认允许“在上载文件时包括本地目录路径”。我只能通过更改客户端配置来禁止此行为,但我仍在搜索基于应用程序的解决方案。 [/编辑]

2 个答案:

答案 0 :(得分:0)

尝试用'%20'替换空格:

"C:\Documents%20and%20Settings\m1krsch\Documents\Now%20Some%20Spaces\ziptest.zip"

答案 1 :(得分:0)

我在本地化代码中发现了一个愚蠢的错误。我正在使用RapidXML,并将整个本地化代码和RapidXML头文封装在一个类中。不幸的是我没有仔细阅读文档。 vector<char>对象中的数据(包含XML文档数据)不会按预期使用xml_document<>方法复制到XML文档对象parse()中。这对我来说看起来像程序C代码,在我看来是糟糕的OOD。文档说:

  

3.1源文本的生命周期

     

原位解析要求源文本至少与文档对象一样长。

当我更正代码以在本地化类中获取全局vector<char>对象时,问题就消失了。

尽管如此,我很困惑为什么大多数其他浏览器对我的旧代码都没有问题。