防止SVG易于逆向工程

时间:2018-05-29 11:44:00

标签: security image-processing svg

我刚开始在一家新公司工作,并被要求做我认为不可能做到的事情,但我需要对此进行确认。我公司的网站允许用户使用SVG以极高的分辨率查看图像。我们为这些图片构建了一个自定义查看器,允许您缩放和滚动图像,效果很好。因此,图像格式需要"保持SVG。但是,我们需要在此图像中包含水印。我们现在正在做的方法是将SVG和PNG水印传递给客户端,将水印插入SVG,并将其显示给用户。这很明显很容易被黑客攻击,因为任何有客户端经验的人都知道(这里的开发团队主要是年龄较大的开发人员,并且没有太多的网络经验)。即使原始SVG没有被截获,他们仍然可以从源中删除水印。我已经说服我的老板将水印注入服务器端,因此这就留下了最终客户端可以编辑SVG的问题。

我想知道的是,如果这两件事中有一件是可能的:

1)是否有另一种类似于SVG的图像格式,可用于保持这种高度可扩展的图像而不会丢失分辨率,并且不会被终端客户端直接编辑?人们似乎在网上讨论的唯一选择是JPG,GIF,PNG和SVG。我看过Adobe Illustrator" .ai"文件和EPS(Encapsulated PostScript)作为其他矢量选项,但如果我可以在PHP中修改这些图像,我无法找到任何地方,如果我想在服务器端代码中叠加水印,这是关键。

2)有没有办法对原始SVG内容进行模糊处理,以便用户不能去操作它?我看过SVG内部有<image ...>个标签,其中PNG表示为长而复杂的字符串。像xlink:href="data:image/png;base64..."这样的东西。我想知道是否有一种方法可以将SVG显示为此字符串,这样就无法直接操作数据。我确定有一个算法来反转这些,但只要我们坚持使用SVG,我需要尽可能安全地使用尽可能多的环来尽可能地跳过想窃取数据。

任何一种方式都是可以接受的,只要删除这个水印比仅仅点击F12并删除开发工具中的元素更复杂。

1 个答案:

答案 0 :(得分:1)

是否有另一种类似于SVG的图像格式,可用于保持这种高度可扩展的图像而不会失去分辨率,并且不会被终端客户端直接编辑?

SVG是一种矢量格式,为了保持极高的可扩展性,你需要坚持使用矢量,无论是任何格式。但是,在这种情况下,始终可以删除属于您的水印的矢量。当然存在以二进制形式存储的矢量格式,这将使得最终用户难以解析和编辑,但这些在PHP中也不可编辑,并且兼容性低得多。所以你可能不想这样做。

有没有办法对原始SVG内容进行模糊处理,以便用户无法进行操作?

首先,它永远不会是'#34;安全&#34;在如上所述的意义上,总是可以从矢量图像中去除水印。 (顺便说一句,像JPG这样的位图格式的唯一区别是位图中水印下面的内容实际上是丢失的,而在SVG中它仍然存在。)

然而,取决于&#34; good&#34;你希望这样,你可以做一些事情。我认为&#34;善良&#34;这意味着去除水印所需的努力,您可以相对容易地提高标准。您不必(并且您可能无法合理地)对整个SVG进行模糊处理。

我想到的一件事是SVG基本上只是XML,它由<rect><line><circle>等标签组成。这些标签的顺序并不是这样的。重要的是(当然,除了当然例外)。所以你可以在现有的标签中随意地缠绕着水印的标签。我的意思是随机,所以不同的下载会产生不同的结果。如果你做得好(例如,你发现行标签为&#34;隐藏&#34;你的水印线标签等),那么很难自动删除水印,因为它& #39;所有相关数据都是您的实际图像。当然,水印仍然可以在视觉上在角落里,这已经是一个弱点,任何被拉到角落的东西都可能被自动移除。我想,任何体面的编辑器都可以很容易地删除它。所以这取决于目的是什么。

但是我仍然认为这种事情在许多情况下都会变得很难(而在其他情况下则完全不够)。