【问题标题】:Delete blob content without 'Delete' permissions using shared access signature使用共享访问签名删除没有“删除”权限的 blob 内容
【发布时间】:2014-02-13 14:54:16
【问题描述】:

我正在使用 Azure blob 存储来存储来自客户端的数据。

客户端被授予共享访问签名,没有“删除”权限。

不过,我可以使用以下代码在没有“删除”权限的情况下删除 blob 内容:

// sharedKey doesn't contain 'Delete' permission
var credentials = new StorageCredentials(sharedKey);
var blob = new CloudBlockBlob(blobPath, credentials);
var blockIds = new List<string>();

// If not getting all current blocks ids, all current data will be lost.
// if (blob.Exists())
// {
//  blockIds.AddRange(blob.DownloadBlockList().Select(b => b.Name));
// }

var blockId =
Convert.ToBase64String(
    Encoding.Default.GetBytes(blockIds.Count.ToString("d6",    CultureInfo.InvariantCulture)));
 blockIds.Add(blockId);

byte[] eventInBytes = Encoding.Default.GetBytes(string.Format(CultureInfo.InvariantCulture, "{0}\n",   formattedEvent));

using (var eventStream = new MemoryStream(eventInBytes))
{
    blob.PutBlock(blockId, eventStream, null);
}

blob.PutBlockList(blockIds);

这是 Azure 缺陷吗(或者我错过了共享访问签名的概念?有什么办法可以克服这个问题?

谢谢!

【问题讨论】:

  • 如果我没记错的话,你并没有真正删除 blob。如果您在共享访问签名中包含写入权限,您只是覆盖了 blob。
  • true,但您必须同意通过上传空字符串覆盖 blob 与删除 blob 相同(我的意思是,您不删除文件本身,而是删除空 blob等于根本没有 blob 文件)
  • 我不这么认为。虽然我同意你的 blob 对你没有用,但我不符合被删除的资格。如果用户上传一些垃圾数据而不是空字符串怎么办?你还会考虑删除 blob 吗?
  • 这取决于旧数据是否已被删除。只要保留现有数据,用户就可以上传他想要的任何数据。
  • 您的客户是只给了 SAS 并且他们编写了代码(如上)还是您编写了这段代码?如果是后者,您可以在上传之前拍摄 Blob 的快照,以便您拥有 Blob 的最后一个工作副本。

标签: azure azure-blob-storage


【解决方案1】:

共享访问权限的实现方式可以授予用户以下访问权限:删除、列表、无、读取、写入 (See this article)。如果您希望您的用户能够创建 blob,则使用这种粒度级别,他们也将能够更新 blob。尽管您可以阻止用户删除 Blob,但通过在没有删除权限的情况下发出 SAS,您无法阻止用户修改 Blob,除非您还拒绝他们创建的能力,这两者都由“写入”权限控制。

【讨论】:

    猜你喜欢
    • 2016-12-27
    • 2017-11-24
    • 2013-05-21
    • 2018-10-21
    • 1970-01-01
    • 2017-05-05
    • 2018-09-02
    • 2021-04-25
    • 2016-02-03
    相关资源
    最近更新 更多