Coldfusion 确实<;cffile>&引用;写下;是否允许在重命名/写入文件之前执行文件?

Coldfusion 确实<;cffile>&引用;写下;是否允许在重命名/写入文件之前执行文件?,coldfusion,upload,cffile,Coldfusion,Upload,Cffile,我已经为我的客户创建了一个文件上传,我正在努力使事情尽可能安全。我使用以下代码来处理文件上传。其想法是重命名文件并将其写入web根目录之外的文件夹 问题是,在“写入”过程中,ColdFusion是否有可能允许在将文件写入文件夹并使用以下代码重命名之前执行恶意文件 这是在我的组件的顶部 <cfset destdir = "/folder/upload/"> 这是处理文件的部分代码 <cfset var local = structNew()> <cfset lo

我已经为我的客户创建了一个文件上传,我正在努力使事情尽可能安全。我使用以下代码来处理文件上传。其想法是重命名文件并将其写入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插件处理的…

您的示例代码看起来与普通文件上传有所不同。您没有cffile action=“upload”,看起来您已经检索到了文件的内容。您应该限制<代码>本地.FILTEXT/<代码>到您认为安全的文件类型和<代码>参数。应该检查内容< /代码>以确保它不是恶意的。一旦您将文件写入webroot,就可以通过url对其进行探测,因此您必须在写入之前验证一切是否安全

对于正常形式的post文件上载,过程应类似于:

  • 使用
    cffile action=“upload”
    将文件上载写入webroot外部的临时文件夹
  • 验证文件的完整性以确保它不是恶意的(如果文件不正确,请删除)
  • 使用
    cffile action=“Move”

  • 您的示例代码看起来与普通文件上载有所不同。您没有cffile action=“upload”,看起来您已经检索到了文件的内容。您应该限制<代码>本地.FILTEXT/<代码>到您认为安全的文件类型和<代码>参数。应该检查内容< /代码>以确保它不是恶意的。一旦您将文件写入webroot,就可以通过url对其进行探测,因此您必须在写入之前验证一切是否安全

    对于正常形式的post文件上载,过程应类似于:

  • 使用
    cffile action=“upload”
    将文件上载写入webroot外部的临时文件夹
  • 验证文件的完整性以确保它不是恶意的(如果文件不正确,请删除)
  • 使用
    cffile action=“Move”

  • 在上传时重命名文件并将其放置在web根目录之外是一个好主意,但仍有一些基本要点可以帮助您提高coldfusion中文件上传的安全性

    对于初学者,带有操作上载的cffile有一个属性“accept”,您可以在该属性中指定允许文件上载的mime类型。
    cffile还有一个“mode”属性(仅适用于linux)用于设置文件的权限。
    资料来源:


    我不认为上传的恶意文件很容易就可以自动执行,但采取预防措施是一种很好的做法。

    在上传时重命名文件并将其放置在web根目录之外是一个好主意,但在coldfusion中如何提高文件上传的安全性仍然有一些基本要点

    对于初学者,带有操作上载的cffile有一个属性“accept”,您可以在该属性中指定允许文件上载的mime类型。
    cffile还有一个“mode”属性(仅适用于linux)用于设置文件的权限。
    资料来源:


    我不认为上传的恶意文件如此容易就可以自动执行,但采取预防措施是一种很好的做法。

    要回答您提出的问题,您的“写入”操作是一次操作。您没有移动和重命名原始文件(至少在上面的代码中没有)。而是创建一个文件句柄,输出一个缓冲区并关闭句柄。在释放句柄之前无法执行代码。如果您正在移动、重命名或复制文件本身,那么可能会出现您担心的间隙,足以允许执行。您还应该知道,如果您打算在单个请求线程中写入然后执行文件,那么文件I/O可能会产生问题(如果您明白我的意思,那么在尝试访问文件时可能会出现错误,因为Java可能会在获得句柄发布通知时稍微提前操作系统)

    这里有一篇关于cffile黑客的帖子,它可能会揭示你问题的边缘


    注意-这是我的理解。。。相当可靠,但在这个名单上有一些相当聪明的人,包括那些已经做出回应的人。在这里不想抢别人的风头。

    回答你的问题-你的“写”操作是一个单一的操作。您没有移动和重命名原始文件(至少在上面的代码中没有)。而是创建一个文件句柄,输出一个缓冲区并关闭句柄。在释放句柄之前无法执行代码。如果您正在移动、重命名或复制文件本身,那么可能会出现您担心的间隙,足以允许执行。您还应该知道,如果您打算在单个请求线程中写入然后执行文件,那么文件I/O可能会产生问题(如果您明白我的意思,那么在尝试访问文件时可能会出现错误,因为Java可能会在获得句柄发布通知时稍微提前操作系统)

    这里有一篇关于cffile黑客的帖子,它可能会揭示你问题的边缘

    注意-这是我的理解。。。非常可靠,但名单上有一些相当聪明的人,包括那些做出回应的人