ColdFusion CFFILE限制文本文件上传

时间:2014-03-24 18:01:09

标签: coldfusion

我想使用CFFILE上传来仅检测.txt文件。我试过使用file.clientfileext来检测扩展名。检测到TXT时,我向用户显示弹出错误消息并删除该文件。但有人告诉我,我甚至不应该允许用户的文件到达我们的服务器。

然后我使用CFFILE accept属性只接受text / plain。这应该这样做但不幸的是在我测试时,当我尝试上传非文本文件时,我得到了ColdFusion错误:

  

上传的文件application / pdf的MIME类型未被接受   服务器。只能上传text / plain类型的文件。校验   您正在上传相应类型的文件。

我尝试使用cftry和cfcatch,但我仍然得到相同的错误,这主要是由于浏览器上传文件时我不知道的MIME类型。 我也在这个论坛中找到了同样的问题并尝试了建议的答案,它没有用,仍然得到了相同的错误信息(见下文)

我还在此论坛中发现了另一个不建议使用CF“接受”属性的帖子。此链接用于进一步详细说明:http://www.petefreitag.com/item/701.cfm

所以我的问题是,既然我还在使用CF8,我实际上没有很多选项来阻止我的用户安全地上传除.txt文件以外的其他文件? 如果我不能使用CFFILE的accept属性,我可以通过执行以下操作至少保护我的文件上传功能吗?但这样做是否足够安全?

  1. 将文件上传到不在根目录下的临时文件夹
  2. 验证文件扩展名
  3. 即使检测到扩展名为.txt
  4. ,也会更改文件名
  5. 将文件移动到根目录
  6. 下的目标文件

    即使我执行了这些步骤,我也必须允许文件到达我们的服务器,顺序是不允许文件到达我们的服务器。

    以下是上一个问题的答案/建议。但是当我测试它时它不起作用:

        <CFTRY>                     
        <cflock name="write_lock" type="Exclusive" timeout="120">
         <cffile action="upload" filefield="filepath" destination="#DestDir#"    
               nameconflict="Overwrite" attributes="Archive">        
        </cflock>
    
        <CFCATCH>
              <cfif FindNoCase("not accepted", cfcatch.Message)>
                <script>
                   $(function(){
                    alert("Only the following file types are allowed: .jpg, .gif, .bmp, 
                    .png.");
                });
            </script>
            <cfabort />
         <cfelse>
            <!--- looks like non-MIME error, handle separately --->
            <cfdump var="#cfcatch#" abort />
         </cfif>
        </CFCATCH>
    
        </CFTRY>
    

4 个答案:

答案 0 :(得分:1)

您可以使用以下代码:

<cffile action="upload" filefield="BidDoc" 
     destination="C:\upload\" 
     nameconflict="makeunique" 
     accept="text/plain">

您可以使用的其他mime类型是:

  • 应用/ PDF
  • 应用程序/ msword
  • 应用/ vnd.ms-Excel中
  • 应用/ vnd.openxmlformats-officedocument.wordprocessingml.document
  • 应用/ vnd.openxmlformats-officedocument.spreadsheetml.sheet

答案 1 :(得分:1)

如果您不想使用Accept属性进行验证,我认为您的步骤是合理的。仅供参考,您可以设置接受.txt而不是MIME类型。 MIME类型由客户确定,因此检查扩展程序更安全。

cffile失败属性验证引发的异常可能没有type,因此您发布的代码尝试通过查看异常FindNoCase() message来检测它。您可以转储异常并找出FindNoCase()未能捕获异常的原因。

确保将任何上传的内容视为可能存在恶意的内容并且不对其进行处理(例如,将其包括在内)。强制文件扩展名为.txt应该足够安全,但我会让其他安全专家感兴趣。

答案 2 :(得分:0)

正如in this answer所讨论的那样,确实没有百分之百的傻瓜式方法。

如果你不想信任&#34;接受&#34;属性,我建议允许用户上传文件,然后使用cffile.contentType属性检查上传文件的mime类型。使用相应的消息检查您希望允许/限制和拒绝的任何mime类型。您也可以选择使用文件扩展名检查作为错误检查的附加层。

必须注意的是,与文件扩展名一样,mime类型不能100%可信,因为它们可以由用户编辑。但是使用组合检查,您可以合理地上传大多数文件的类型正确。

答案 3 :(得分:0)

Coldfusion不会阻止文件上传到服务器。您可以设置最大文件大小,但在上载期间会对其进行处理。在上传文件之后,cffile标记会启动。此外,要确定文件是文本文件还是jpg,exe,rar等文件是相当困难的。以下q&amp; a可能有所帮助:

Determining binary/text file type in Java?

在我看来,最好遵循pete freitag给出的提示,并使用java类来确定文件类型。然后,您可以删除所有非文本文件。