上传安全限制

2026-01-27   访问量:1008

本文档介绍客户端上传常见问题的应对方案,以下示例适用于直传和客户端 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 **/



// 获取前端传进来的文件后缀 ext

const 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 直传实践






热门文章
更多>