0

我正在使用 web 应用程序测试一些东西,用户可以在其中看到几张图像,但不能一次看到所有图像。整个数据被发送到客户端并在客户端解密。然后该数据在base64中,所以我只需使用:

img.src = 'data:image/jpeg;base64,' + imgdata;

为了显示它。然后我可以打电话

my2Dcontext.drawImage(img, x, y, width, height)

一切都会好的,对吧?

除了不,原始的完整数据非常容易下载。只需从图像中复制数据源,然后下载或打开检查器并以这种方式下载。

出于这个原因,我想知道如何可以想象如何将来自 imgData 的数据放到屏幕上,而不必将它们全部放在屏幕上。

有没有办法将图像的一部分从数据渲染到画布上,而无需创建诸如完整图像数据 url 之类的东西?

我知道这是一个奇怪的案例,但如果你们中的任何人有任何创意,我将不胜感激!

(PS,我知道这在某种意义上本质上是通过默默无闻的安全性,如果他们可以在屏幕上单独显示这些部分,他们可以将它们拼凑在一起。我只是试图停止最简单的提取级别。谢谢)

4

2 回答 2

1

好吧,您实际上无法保护显示的图像免受决心获取图像的用户的影响。然后可以使用一个简单的屏幕抓取工具将图像的图块/部分拼凑在一起。高级用户可以注入脚本来自动执行相同的操作。

但是,为了创造性的方法:

图像数据混淆

可以选择在交付之前对数据本身进行模糊处理,这样如果尝试下载源代码,它将毫无用处。当显示在画布上时,您可以“解码”数据以使其正确显示(但随后再次引用屏幕抓取工具,用户必须将画布保存为图像等选项)。

不过,混淆不必非常复杂,您需要找到一种算法可以混淆源的位图数据,以及一种将其恢复顺序的方法——这当然会带来有损自身的挑战JPEG等格式;这里几乎需要PNG(我是否提到更高级的(?)用户也可以提取解码内容的代码)。

视频加密 ( EncryptedMediaExtensionsAPI)

另一种方法是将图像作为受 DRM 保护的视频流(每个部分可以是一个帧)提供。这可能会在屏幕抓取器的情况下产生一些影响,具体取决于操作系统/硬件支持等,但不要赌它(即使浏览器支持 DRM)......

如果没有 DRM,只需获取视频并使用 ffmpeg 等工具提取每一帧。

水印

至少在库存照片领域,一种广泛采用的解决方案是为每个预览和图块添加水印。这将升级游戏并迫使有决心的用户启动 Photoshop 或类似的东西,并花费比认为有趣的时间更多的时间来删除它们;结果可变。

这可能适合也可能不适合您的情况。

价值?

就个人而言,我不会花时间尝试这样做。为此付出的努力很快就会得到解决。

根据目的,水印瓷砖/部分(在源头)可能是更有效的解决方案。

于 2017-09-01T14:33:30.837 回答
0

确保用户只能访问允许的内容的唯一方法是只给他们这个。

因此,您需要在服务器上处理和切片您的图像,然后只将需要的部分重新传递给客户端。

于 2017-09-01T09:43:48.450 回答