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

有什么想法吗?

解决方法

是的,您将文件名作为请求的一部分传递仍然存在问题。有人可以进入那里对您的文件造成严重破坏。您是否正在验证登录用户是否应该可以访问有问题的文件?如果他们传入其他人文件的值怎么办?这似乎也容易受到路径遍历攻击。如果你传入`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);
        }
    });
});

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

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

好的,根据 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',() => {
    const fileName = $('.modal-wrapper').find('.file-name').text();
    $.ajax({
        url,data: 'fileName=' + fileName,error(status) {
            console.log(status.statusText);
        }
    });
});

似乎工作正常!