对象存储 上传安全限制

这篇说说客户端上传文件到COS时的三种常见问题应对方案:限制文件大小、限制文件类型和防止文件覆盖,均提供PutObject与PostObject场景的代码示例,核心是服务端决定上传路径以防止覆盖。 限制文件大小:通过STS临时密钥policy或签名policy设置content-length条件,超出则返回403。 限制文件类型:通过设置content-type条件为image/*,非图片文件上传被拒绝。 防止文件覆。

相关产品
对象存储 产品页,含版本规格、价格与购买入口。

这篇档介绍客户端上传常见问题的应对方案,以下示例适用于直传和客户端 SDK 上传场景。

服务端代码实现以 Node.js 为例,更多语言请参见 服务端签名实践。

一、场景1:PutObject 上传,通过设置 sts 临时密钥 policy 里的 condition 设置 numeric_less_than_equal 条件来实现

condition: { // 限制上传文件必须小于 5MB 'numeric_less_than_equal': { 'cos:content-length': 5 * 1024 * 1024 }, }

二、场景2:PostObject 上传,通过签名 policy 的 conditions 设置 content-length-range 条件来实现

var policy = JSON.stringify({ … conditions: [ ['content-length-range', 1, 5 * 1024 * 1024], // 可限制上传文件大小范围比如1 – 5MB ], });

以上示例对于超出5MB 的文件上传将返回报错403。

三、场景1:PutObject 上传,通过设置 sts 临时密钥 policy 里的 condition 设置 string_like 条件来实现

condition: { // 限制上传文件 content-type 必须为图片类型 'string_like': { 'cos:content-type': 'image/*' } }

四、场景2:PostObject 上传,通过签名 policy 的 conditions 设置 $Content-Type 条件来实现

var policy = JSON.stringify({ … conditions: [ // 限制上传文件 content-type 必须为图片类型 ['starts-with', '$Content-Type', 'image/*'], ], });

以上示例对于非图片文件的上传将返回报错403。

五、三、上传文件防覆盖

在 Web 或客户端上传场景中,如果文件名由客户端指定,可能存在文件被覆盖上传的风险。

要防止文件被覆盖的关键措施是服务端决定上传路径。

/** 服务端生成上传路径示例 nodejs **/ // 获取前端传进来的文件后缀 extconst ext = req.query.ext;const cosKey = generateCosKey(ext);function generateCosKey(ext) { const date = new Date(); const m = date.getMonth() + 1; const ymd = `${date.getFullYear()}${m < 10 ? `0${m}` : m}${date.getDate()}`; const r = ('000000' + Math.random() * 1000000).slice(-6); const cosKey = `file/${ymd}/${ymd}_${r}${ext ? `.${ext}` : ''}`; return cosKey;};

六、执行过程

1. 在客户端选择文件,客户端将后缀发送给服务端。

2. 服务端根据后缀,生成带时间的随机 COS 文件路径,并计算对应的签名,返回 URL 和签名信息给客户端。

3. 客户端使用 PUT 或 POST 请求,直传文件到 COS。

七、相关文档

·用于前端直传 COS 的临时密钥安全指引

·Web 端直传实践

·小程序直传实践

·移动应用直传实践

·鸿蒙直传实践

·Flutter 直传实践

·uni-app 直传实践

赞 (0)
上一篇 4天前
下一篇 4天前