我为我的客户创建了一个文件上传,我正在努力使事情尽可能安全。我正在使用以下代码来处理文件上传。我们的想法是重命名文件并将其写入Web根目录之外的文件夹。
问题是,在“写入”过程中,ColdFusion是否有可能在将文件写入文件夹并使用以下代码重命名之前允许恶意文件执行?
这是我的组件的顶部...
<cfset destdir = "/folder/upload/">
这是处理文件的代码的一部分......
<cfset var local = structNew()>
<cfset local.response = structNew()>
<cfset local.response['catcher'] = ''>
<cfset local.filename = listGetAt(#arguments.file#, 1, ".")>
<cfset local.fileext = ListLast(#arguments.file#, ".")>
<cfset local.nfile = #CreateUUID()# & "." & #local.fileext#>
<cftry>
<cffile action="write" file="#destdir##local.nfile#" output="#arguments.content#">
<cfset local.response['newfilename'] = local.nfile>
<cfcatch type="any">
<cfset local.response['catcher'] = "Write Exception " & #cfcatch.Detail# & " | " & #cfcatch.Message#>
<cfset local.response['success'] = true>
<cfreturn local.response>
</cfcatch>
</cftry>
我应该提一下,文件上传程序正由CFC和Valums的AjaxUpload插件处理......
答案 0 :(得分:4)
您的示例代码看起来像是在执行与普通文件上传不同的操作。你没有cffile action =“upload”,看起来你已经检索到了文件的内容。您应该将local.fileext
限制为您认为安全的文件类型,并且应检查Arguments.content
以确保它不是恶意的。一旦您将文件写入webroot,就可以通过url进行探测,因此您必须在编写之前验证一切都是安全的。
使用正常的表单文件上传后,该过程应该类似于:
cffile action="upload"
将文件上传写入webroot外的临时文件夹cffile action="move"
答案 1 :(得分:1)
要回答你问的问题 - 你的“写”操作是一个操作。您没有移动并重命名原始文件(至少在上面的代码中没有)。而是创建一个文件句柄,输出缓冲区并关闭句柄。在释放句柄之前无法执行代码。如果您正在移动并重命名或复制文件本身,则可能存在间隙,因为您担心 - 足以允许执行。您还应该知道,如果您打算编写文件I / O可能会产生问题,然后在单个请求线程中执行该文件(尝试访问该文件时可能会出错,因为Java可能会在获得通知时略微超过操作系统如果你看到我正在说的话,请释放句柄。
这是一篇关于cffile hacking的帖子,可能会解决你问题的边缘。
http://www.coldfusionmuse.com/index.cfm/2009/9/18/script.insertion.attack.vector
注意 - 这是我的理解......非常可靠,但是这个名单上有一些相当聪明的人,包括已经回复的人。不试图在这里窃取任何人的雷声。
答案 2 :(得分:0)
在上传时重命名文件并放在Web根目录之外是一个好主意,但是仍然有一些基本要点如何在coldfusion中提高fileupload的安全性。
对于初学者来说,带有操作上传的cffile有一个属性“accept”,您可以在其中指定文件上传允许的 mime-types (逗号分隔列表)。
cffile还有“mode”属性(仅限linux),可为文件设置权限。
来源:http://livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content=Tags_f_02.html
我不认为上传的恶意文件在上传时很容易自动执行,但采取预防措施是一种很好的做法。