【问题标题】:Delete file using Coldfusion via jQuery ajax通过 jQuery ajax 使用 Coldfusion 删除文件
【发布时间】:2021-06-24 02:26:25
【问题描述】:

在模式中填充有关文件的数据后,我正在尝试删除图像文件。

我的 jQuery 看起来像这样:

const deleteMedia = () => {
    const url = '../../includes/delete-media.cfc?method=deleteMedia';
    $(document).on('click', '.confirm-delete', () => {
        const fileName = $('.modal-wrapper').find('.file-name').text();
        $.ajax({
            url,
            type: 'POST',
            data: 'fileName=' + fileName,
            dataType: 'json',
            success(data) {
                console.log(data);
            },
            error(status) {
                console.log(status.statusText);
            }
        });
        return false;
    });
};

export default deleteMedia;

还有我的 Coldfusion 文件 delete-media.cfc:

<cffunction name="deleteMedia" access="remote" returnType="any" returnformat="json">
    <cfargument name="fileName" >
    <cfset requestBody = toString( getHttpRequestData().content ) />
    <!--- Double-check to make sure it's a JSON value. --->
    <cfif isJSON( requestBody )>
        <cfset VARIABLES.DeleteFileName = deserializeJSON( requestBody )>
        <cffile
            action = "delete"
            file = "C:\pathToSite\img\#variables.DeleteFileName#"
        >
        <cfdump var="#variables.DeleteFileName#">
    </cfif>
</cffunction>

当我在“网络”面板中检查时,这是发送 fileName = fileName 作为数据,并返回 200,尽管我看不到 cfdump 的内容。

我对 FE 没问题,对 CF 没那么热,我的猜测是我的 CF 过于复杂,但也没有做我希望它做的事情。我确实尝试参考了我不久前写的一些东西,另外还有:

How to use Ajax to pass Javascript variables to Coldfusion?

还有这个:

Passing and returning ColdFusion Structure via JQuery

有什么想法吗?

【问题讨论】:

  • 是的,CFML 是相当老派的。我的第一个想法是您不需要使用 .cfc。简化端点并使其成为 .cfm 文件。通过输出 SerializeJSON(myReturnStruct) 将您想要的任何内容返回到前端,然后您可以通过查看 Ajax 成功回调中的返回数据进行调试,也可以使用 WriteLog()。您不需要调用 getHttpRequestData()。您的所有表单字段都将在端点的表单范围内。祝你好运。
  • 我退休前采用的方法是首先让 CF 代码在独立文件中工作。然后我会把它放在 cfc 中,并在从 CF 调用函数时让它工作。从 JS 调用它是最后一步。顺便说一句,从 JS 调用 CF 代码时,你永远不会看到 cfdump 的内容。
  • 谢谢。我确实去了cffiddle.org 做一点调试。
  • 我不同意不应使用 CFC 处理的断言。相反,我认为它绝对应该使用CFC。使用 a.cfm 进行 AJAx 调用是“老派”
  • @ScottStroz 你能概括一下区别吗?

标签: javascript jquery ajax coldfusion cfc


【解决方案1】:

是的,您将文件名作为请求的一部分传递仍然存在问题。有人可以进入那里对您的文件造成严重破坏。您是否正在验证登录用户是否可以访问相关文件?如果他们传递其他人文件的值怎么办?这似乎也容易受到路径遍历攻击。如果你传入`filename=../../someReallyImportaintFile',会被删除吗? owasp.org/www-community/attacks/Path_Traversal

如果这是一个个人网站而不是商业网站,则可能没什么好担心的。如果这是客户的网站,我会更加担心。

在 Windows 中,我在这里安装了 Steam:

`D:\Steam\`. 

我可以在 Windows 资源管理器中打开此路径:

`D:\Steam\bin`. 

这条路我也可以开,

`D:\Steam\bin\..\config`

其中列出了D:\Steam\config

如果我钓鱼

`deleteFileName=..\..\Windows\some\folder\someFile` 

如果您的服务器权限未设置为防止 CF 删除服务器上的任何内容,我或许可以从您的 Windows 目录中删除文件。

你的CF用户不应该是服务器的管理员账号,有lockdown guides可以帮助防止各种安全攻击。

理想情况下,您会将文件列表存储在数据库表中,然后引用 FileID 作为删除请求参数。

$(document).on('click', '.confirm-delete', () => {
    $.ajax({
        url,
        type: 'POST',
        data: 'fileID=' + $('#SomeHiddenField').val(),
        success(data) {
            console.log(data);
            hideOverlay();
        },
        error(status) {
            console.log(status.statusText);
        }
    });
});

然后,在服务器上,最好的情况是你验证

  • 用户是否登录?
  • 他们有权访问此文件吗?
  • 他们是否有权删除此文件?
  • 删除物理文件
  • 将记录标记为已删除,并注明删除时间和删除人。

【讨论】:

  • 谢谢你,我还在消化它。即使我只是访问只有我可以访问的网站的一部分,我也愿意采用这些政策。
【解决方案2】:

好的,根据 Redtopia 的评论,我创建了这个:

<cfset requestBody = toString( getHttpRequestData().content ) />
<!--- Double-check to make sure fileName exists. --->
<cfif len(requestBody)>
    <cfset deleteFileName = requestBody.split("=")[2] />
    <cfoutput>#deleteFileName#</cfoutput>
    <cffile
        action = "delete"
        file = "C:\pathToSite\img\#deleteFileName#"
    >
<cfelse>
    <cfoutput>fileName not correct</cfoutput>
</cfif>

然后在我的 ajax 调用中我删除了 dataType json。

$(document).on('click', '.confirm-delete', () => {
    const fileName = $('.modal-wrapper').find('.file-name').text();
    $.ajax({
        url,
        type: 'POST',
        data: 'fileName=' + fileName,
        success(data) {
            console.log(data);
            hideOverlay();
        },
        error(status) {
            console.log(status.statusText);
        }
    });
});

似乎工作正常!

【讨论】:

  • 是的,您将文件名作为请求的一部分传递仍然存在问题。有人可以进入那里对您的文件造成严重破坏。您是否正在验证登录用户是否可以访问相关文件?如果他们传递其他人文件的值怎么办?这似乎也容易受到路径遍历攻击。如果你传入`filename=../../someReallyImportaintFile',会被删除吗? owasp.org/www-community/attacks/Path_Traversal
  • 它位于我网站的一部分,它是有密码的,只有我可以访问。但是,如果有更好或更安全的方法来实现我想要的,我会全力以赴。在这些之前我正在做的事情是通过 ftp 上传或删除,所以这是一个巨大的改进。
  • file = "C:\pathToSite\img\#deleteFileName#" 中的文件路径我已经截断它实际上指向我服务器上的特定目录,但是您是否建议如果有人遍历树并猜测文件夹和文件名他们可以删除它?我不明白任何人如何操纵 cfml 中的文件路径,如果它是从服务器发送的,他们将无法访问,除非我遗漏了一些东西。我对黑客技术了解不多。
  • @lharby 由于这是来自 CF 服务器,它将以 CF 用户身份执行。如果 CF 可以访问一个目录,那么该目录中的文件就可以被操作。除非您限制 CF 帐户的访问权限。在处理文件操作时,重要的是要记住您正在执行操作的上下文以及该上下文允许的权限。此外,如果您的网站有受密码保护的部分,则您不能相信您是唯一拥有密码的人,或者永远是您使用该密码的事实。纵深防御仍然是一个很好的概念。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多