201707/31/123432X{16}_200x200.jpg
文件上传要考虑的点
上传文件的校验
文件名的校验
长度判断
-
超过DB字段长度会报错
-
操作系统对文件名的长度有一定的限制
特殊字符的校验
某些字符不可能是文件名,当通过浏览器指定文件名下载的时候,可能会出错
上传频率的校验
如果支持批量文件上传的话,那咱接口的qps应该是分段集中的图,我们需要制定一下这种情况下的限定策略
-
IP限制的策略
-
用户限制的策略
上传速度的限制
如果不限制上传速度的话,用户上行速度比较快的时候, 一个用户的上传可能就会瞬间打满服务器的网卡
扩展名的校验/MIME的校验
体积的校验
-
限制特大文件
-
限制用户可以上传的空间余额
尺寸的校验
主要用于 图片,视频 的限制,不符合宽高比,或者某个分辨率的时候,需要作出相应的提示
MagicBytes的校验
为什么要对文件的头字节进行校验?
文件的头字节可以判断这个文件是否是真的图片(isImage),也可以矫正写错扩展名的图片(guessSuffix);如gif的写成了jpg;不至于被可执行文件伪装的jpg入侵
上传附件文件名的生成
Note
|
URL中的时间 |
从犯罪团伙的诈骗案例讲起,某日平台接到大量C端客户被诈骗的举报;某诈骗团伙批量copy线上已经存在的商品,然后将商品的价格稍稍改低,这样就会通过搜索获取大量的流量;在用户购买完商品之后,回复没货,获取用户的联系信息,通过电话进行诈骗。
通过分析,诈骗团伙copy的商品大多都是正常卖家一段时间之前发的商品,由于在同一个平台上,诈骗团伙连图片都没有重新上传
根据这一信息,我们在发布商品的时候静默的记录这些数据(这规则如果公布了,就很容易被越过)(校验方式,通过在图片的url中加入时间信息),并对这些帐号进行标记
如果直接修改url中的时间,是不是可以直接越过后端的校验呢?是的,但是这样,图片也就失效了,可以直接忽略
那如果下载了图片再上传,这使用程序实现不是什么麻烦的事情,那怎么办?使用相似图片识别功能,判别同款 (其实这个在正常的商家发布商品之后,就有这样的审核逻辑)
Note
|
URL中的尺码 |
在很多业务中,为了前端页面显示的美观,或者其他什么原因;通常需要限制图片的比例和大小,但是上传图片和保存业务数据是分开的两个request,恶意请求很容易跳过上传这个步骤直接保存
现在我们有个比较严谨的方法对传过来的图片url做校验,下载CDN上的图片,判断图片的尺码;但是想想,每次保存,那么大的图片量,这样的响应时间是吃不消的;
退而求其次,我们可以通过在图片的URL上加上原始尺寸,这样在保存的时候只要对URL字符串进行分析就可以了
同样的,如果直接修改URL中的原始尺寸,这样的图片不存在,可以直接忽略
浏览 27844 次