通过 jQuery ajax 使用 Coldfusion 删除文件

Delete file using Coldfusion via jQuery ajax

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

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

有什么想法吗?

好的,根据 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 调用中我删除了数据类型 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

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

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

`D:\Steam\`. 

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

`D:\Steam\bin`. 

这个路径我也可以打开,

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

其中列出了 D:\Steam\config

如果我用

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

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

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

理想情况下,您可以将文件列表存储在数据库中 table,然后引用一个 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);
        }
    });
});

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

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