Ajax和OSS文件上传、删除
情况介绍
这里我们预期的页面是这样的:
<form action="?" method="post">
<input type="hidden" name="Final_Result" value="NULL">
<input type="file"><br>
<input type="button" value="点击上传文件">
</form>
当用户选择完要上传的文件后,点击“点击上传文件”按钮,之后使用Ajax将文件提交到后台服务器。
之后后台服务器返回一个object的名称,将该object的值存放在
Final_Result
中,最后再使用Ajax将表单提交回后台,这里使用Ajax是不想读取
<input type="file">
的值。这样就可以将文件比较大的图片提前传回后台,从而在最后提交表单时能加快响应速度。
问题1
这样进行的问题是,当用户发现自己的文件上传错误了,想重新上传正确的文件。对于用户来说,需要进行的操作很简单,点击
<input type="file">
,之后点击“点击上传文件”按钮,完成。但是这时有一个问题,我们必须把旧文件删除掉,否则该文件会一直保留在OSS服务器中,而且你不确定是否需要可以删除该文件。
而要进行旧文件的删除是很简单的,直接把保存在
Final_Result
中的值传回后台,后台根据这个值进行删除就可以了,但是这样又引出了问题2。
问题2
用户传过来的object直接进行删除吗?如果他将别人上传的文件的文件名通过浏览器控制平台写入:
Final_Result
这时就可能产生错误。所以为了预防上述情况的发生,我们该怎么做?
设想解决方案1:
- 使用对称密钥进行加密,在传输会后台后再解密
这样对方在不知道你密钥的情况下就难以刻意设置Final_Result字段值了。
设想解决方案2:
- 在object中植入时间信息
当用户传回的Final_Result中的时间信息表示该object是在一天以前上传到后台服务器的,那么表示用户操作的一定是旧的数据,那么该数据在数据库中应该有相应记录(当然筛选记录时会加入当前用户的身份信息)。
如果是当天之内的,则表示该object可能是用户刚才上传时发现上传错误后决定重新上传的。也可能恰巧另一个用户上传了一张图片,被该打算进行恶意操作的用户得知,
于是利用该程序漏洞进行恶意删除他人数据。这个方法实现起来简单,但是是存在问题的,当同一时间上传的量较小的可以尝试该方式。
设想解决方案3:
- 拷贝最后的object
在用户上传阶段,不对用户的上传进行删除操作,统一将用户上传的文件保存在担任暂存功能的temp_bucket的bucket下,当用户完成最后的输入,则将最后的Final_Result的object从temp_bucket中复制到保存最后结果的bucket中。
而OSS是支持object复制的,只是速度我就不知道了。同时只需要定期对temp_bucket进行清理就可以了,其中中间步骤减少了对旧的object的删除,速度上也更快。
而且由于没有设置删除操作,都是上传,所以不需要担心用户在上传部分,借用object的删除进行恶意删除他人文件的功能了。
本人菜鸟,所以想到的解决办法可能实际使用起来存在漏洞,或者是我想的不够全面,望大神多喷喷我,我需要进步。