You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure Blob存储SAS临时URL暴露永久URI该如何处理?

认知纠正

你的担心是基于错误的前提:默认配置下,Blob的永久URI本身不支持匿名访问。仅当你主动将Blob所在的容器设置为「公共读」/「公共读写」权限时,第三方才能不带任何身份凭证直接访问Blob的永久URI。
如果容器关闭了公共访问权限,即使第三方提取到了永久URI,没有合法的SAS Token、存储账户密钥或AAD访问令牌,请求会直接返回403/404错误,完全无法访问资源。


SAS临时链接的核心价值
  • 无需向第三方泄露高权限的存储账户密钥,仅下发权限、有效期严格受控的访问凭证
  • 可细粒度控制访问范围:支持限制允许的操作(读/写/删等)、允许的访问IP、允许的访问时间段
  • 无需额外维护用户身份体系,即可快速对外提供临时资源访问能力

隐藏Blob永久URI的实现方案

原生SAS URL的机制决定了它必须携带真实的Blob资源地址,没有办法直接隐藏,如果你确实有隐藏存储路径的需求,最常用的方案是新增一层中间代理做转发:

方案:自建服务代理转发

你可以在自己的业务服务中新增一个文件访问接口,用户仅能看到你提供的业务域名路径,全程接触不到Azure的Blob地址:

// Express 接口示例
import express from 'express';
const app = express();

app.get('/download/:fileSerialNo', async (req, res) => {
  const serialNo = req.params.fileSerialNo;
  // 内部根据业务编号查询对应的Blob名称、容器信息,映射关系不对外暴露
  const blobName = getBlobNameBySerialNo(serialNo);
  
  // 生成SAS Token
  const sasToken = generateBlobSASQueryParameters(sasOptions, sharedKeyCredential).toString();
  const realSasUrl = `${containerClient.getBlockBlobClient(blobName).url}?${sasToken}`;

  // 可选1:临时跳转,短时间内用户可能看到真实SAS地址,但跳转入口是你可控的业务地址
  // res.redirect(302, realSasUrl);

  // 可选2:服务端代理返回,完全隐藏真实Blob地址,适合敏感资源
  const blobClient = containerClient.getBlockBlobClient(blobName);
  const downloadRes = await blobClient.download();
  res.setHeader('Content-Type', downloadRes.contentType!);
  res.setHeader('Content-Disposition', `attachment; filename="${blobName}"`);
  downloadRes.readableStreamBody?.pipe(res);
});

app.listen(3000);

注意事项

如果当前你的Blob容器开启了公共访问权限,建议立即关闭,仅通过SAS或身份验证的方式提供访问,从根源避免未授权访问的风险。

内容的提问来源于stack exchange,提问作者kira

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 06:39:04