【问题标题】:ColdFusion CFFILE to limit text file uploadColdFusion CFFILE 限制文本文件上传
【发布时间】:2014-05-02 06:22:25
【问题描述】:

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

然后我使用 CFFILE 接受属性只接受文本/纯文本。这应该可以,但不幸的是,当我尝试上传非文本文件时,在我的测试中出现 ColdFusion 错误:

上传文件 application/pdf 的 MIME 类型未被接受 服务器。只能上传 text/plain 类型的文件。核实 您正在上传适当类型的文件。

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

我还在这个论坛上发现了另一个帖子,不建议使用 CF “accept” 属性。提供此链接以获得更详细的说明:http://www.petefreitag.com/item/701.cfm

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

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

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

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

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

【问题讨论】:

    标签: coldfusion


    【解决方案1】:

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

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

    确保您将上传的任何内容视为潜在恶意内容并且不对其进行处理(例如 cfinclude 它们)。将文件扩展名强制为 .txt 应该足够安全,但我会让其他安全专家参与进来。

    【讨论】:

      【解决方案2】:

      您可以使用以下代码:

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

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

      • 申请/pdf
      • 应用程序/msword
      • application/vnd.ms-excel
      • application/vnd.openxmlformats-officedocument.wordprocessingml.document
      • application/vnd.openxmlformats-officedocument.spreadsheetml.sheet

      【讨论】:

      • 问题说他不信任accept属性。
      • 我做到了。当用户上传非文本文件时,他们会收到错误消息:服务器不接受上传文件 application/pdf 的 MIME 类型。只能上传 text/plain 类型的文件。确认您正在上传适当类型的文件。我使用了cftry cfcatch,它没有做任何事情,仍然得到同样的错误信息
      • 以下代码对我有用:- &lt;cftry&gt; &lt;cfif isDefined('Form.tmpfile')&gt; &lt;cfset root = ExpandPath("/upload")&gt;&lt;!---location where file should be uploaded---&gt; &lt;cfset filename = GetFileFromPath(Form.tmpFile)&gt; &lt;cfset FileExt=ListLast(filename,".")&gt; &lt;cfset filename = "BidDocument." &amp; FileExt&gt; &lt;cffile action="upload" filefield="BidDoc" destination="C:\upload\" nameconflict="makeunique" accept="text/plain"&gt; &lt;/cfif&gt; &lt;cfcatch&gt; &lt;cfoutput&gt;Wrong File Uploaded&lt;/cfoutput&gt; &lt;/cfcatch&gt; &lt;/cftry&gt;
      【解决方案3】:

      正如in this answer 所讨论的那样,确实没有 100% 万无一失的方法。

      如果您不想信任“accept”属性,我建议允许用户上传文件,然后使用 cffile.contentType 属性检查上传文件的 MIME 类型。检查您希望允许/限制和拒绝的任何 mime 类型并使用适当的消息。您还可以选择使用文件扩展名检查作为错误检查的附加层。

      必须注意,像文件扩展名一样,mime 类型不能 100% 准确可靠,因为它们可以由用户编辑。但是通过综合检查,您可以合理地确认大多数上传的文件都是正确的类型。

      【讨论】:

        【解决方案4】:

        Coldfusion 不会阻止文件上传到服务器。您可以设置最大文件大小,但这会在上传期间进行处理。 文件上传之后,cffile 标记开始生效。此外,要真正确定文件是文本文件还是 jpg、exe、rar 等文件是相当困难的。以下问答可能会有所帮助:

        Determining binary/text file type in Java?

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-10-09
          • 1970-01-01
          • 1970-01-01
          • 2015-04-17
          • 1970-01-01
          • 1970-01-01
          • 2011-03-28
          相关资源
          最近更新 更多