从上传一个文件说起

    在编写一个应用时,上传一个文件是十分常用的功能,比如上传头像,上传证件,上传文件等等。

    这个功能看似非常简单:把客户端传过来的文件保存到服务器,然后将这些元信息存入数据库,甚至好多现成的库都提供了这个功能。

    但是如果真要写好了却并不是很容易,今天我就总结一些重要的步骤。事实上你会发现,这里面有非常多的话题。

    1. 拿到上传文件后,首先应该做的一件事是,简单检查文件格式,可以采用后缀名的方式。这步的目的是排除无意的错误,比如无意中选错了文件。

    2. 其次应该检查文件大小。一般tomcat会限制最大上传文件大小为2M,可以通过修改server.xml中的connector节点中的maxPostSize来修改这个值;实际中限制文件大小的地方可能会比较多(请参考apache和php的上传文件大小限制)。这里不推荐直接将限定值改到无限,原因是你永远都不能想象用户会对你的应用做什么。

    3. 接下来应当对文件名进行安全过滤,确保上传的文件不会出现directory travel安全漏洞。一般可以采取白名单的方式或者getCanonicalPath比对的方式。

    4. 然后应当对文件名及其元信息做sql injection检查以及xss过滤,确保存入数据库之后不会导致sql injection漏洞以及不会传播xss。

    5. 接下来需要将上传文件保存到一个沙盒中,确保首先文件不会运行或者影响到其他文件,同时也不会被其他文件或者程序影响。

    6. 对文件进行病毒或者恶意代码扫描(视情况可能还需要扫描文件内容)。

    7. 将文件拷贝到真正的路径

    8. 将文件元信息存入数据库

    9. 另外还得注意异常的捕获以及错误提示,还有错误的回滚(比如出错了需要删除之前临时保存的文件防止浪费空间以及这种类型的攻击)。


参考:

解决Apache2+PHP上传文件大小限制的问题 http://www.kukaka.org/home/content/72


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值