通过 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);
}
});
});
然后,在服务器上,最好的情况是您验证
- 用户是否登录?
- 他们有权访问此文件吗?
- 他们是否有权删除此文件?
- 删除物理文件
- 将记录标记为已删除以及删除时间和删除人。
在模式中填充有关文件的数据后,我正在尝试删除图像文件。
我的 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);
}
});
});
然后,在服务器上,最好的情况是您验证
- 用户是否登录?
- 他们有权访问此文件吗?
- 他们是否有权删除此文件?
- 删除物理文件
- 将记录标记为已删除以及删除时间和删除人。