问题描述
我的 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);
}
});
});
似乎工作正常!