1

我想保护我网页中的图像。

我想显示图像,但用户想要下载或保存图像,图像不应该保存到他的本地硬盘驱动器。

我编写了自定义处理程序来限制对下载图像的访问,但是这个处理程序也限制了图像的显示。

我的代码是

public class MyFileHandler : IHttpHandler
{

    public void ProcessRequest(HttpContext context)
    {
       context.Response.ContentType = "image/Jpeg";
       context.Response.Write("you dont have access");
    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}

在 web.config 中

<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.0"/>
    <httpHandlers>
      <add verb="*" path="*.jpg" validate="true" type="MyFileHandler"/>
    </httpHandlers>
  </system.web>
</configuration>

是否有任何解决方案可以在网页中显示图像但不保存或下载图像。

4

2 回答 2

0

简而言之,没有。您提供给客户端浏览器的内容在客户端计算机上,并且可以保存。它可能会保存在缓存中。无论您是直接提供图像还是通过处理程序提供图像,从浏览器的角度来看都是一样的。

如果您不希望有人能够将图像保存到硬盘驱动器,请不要将该图像放到网上。

于 2013-06-20T10:07:41.277 回答
0

我能想到的一件事是为图像分配一个令牌,并让过期值非常短,比如几分钟。例如,在 Azure 存储帐户中,可以创建一个私有容器并使用 SAS 令牌在客户端显示图像。但正如其他人所说,没有办法阻止用户下载图像。

        [HttpGet("SasExample")]
        public async Task<IActionResult> SasExample()
        {
            string connectionString = "your-container-connection-string";
            BlobServiceClient blobServiceClient = new BlobServiceClient(connectionString);
            var sourceContainer = blobServiceClient.GetBlobContainerClient("container-name");
            await sourceContainer.CreateIfNotExistsAsync();

            BlobClient blob = sourceContainer.GetBlobClient("file-name");
            var res = GetServiceSasUriForBlob(blob, null);

            return Ok(res.AbsoluteUri);
        }



private static Uri GetServiceSasUriForBlob(BlobClient blobClient, string storedPolicyName = null)
        {
            // Check whether this BlobClient object has been authorized with Shared Key.
            if (blobClient.CanGenerateSasUri)
            {
                // Create a SAS token that's valid for one hour.
                BlobSasBuilder sasBuilder = new BlobSasBuilder()
                {
                    BlobContainerName = blobClient.GetParentBlobContainerClient().Name,
                    BlobName = blobClient.Name,
                    Resource = "b" //b for blob //c for container
                };

                if (storedPolicyName == null)
                {
                    sasBuilder.ExpiresOn = DateTimeOffset.UtcNow.AddHours(1);
                    sasBuilder.SetPermissions(BlobSasPermissions.Read |
                        BlobSasPermissions.Write);
                }
                else
                {
                    sasBuilder.Identifier = storedPolicyName;
                }

                Uri sasUri = blobClient.GenerateSasUri(sasBuilder);
                Console.WriteLine("SAS URI for blob is: {0}", sasUri);
                Console.WriteLine();

                return sasUri;
            }
            else
            {
                Console.WriteLine(@"BlobClient must be authorized with Shared Key 
                          credentials to create a service SAS.");
                return null;
            }
        }
于 2021-03-23T17:08:36.217 回答