是否可以将二进制图像数据放入html标记中,然后在任何浏览器中像往常一样显示图像?

时间:2010-03-12 01:33:39

标签: html security image apache2 passenger

这是一个重要的安全问题,我相信这应该是可能的。

一个简单的例子:

您运行社区门户。用户已注册并上传他们的照片。 只要允许显示图片,您的应用程序就会提供安全规则。例如,用户必须是系统各方的朋友,以便您可以查看其他人上传的图片。

问题出现了:有人可能会抓取您服务器的图像目录。但是您希望保护您的用户免受此类攻击。

如果可以将图像的二进制数据直接放入HTML标记中,则可以限制用户对用户的访问权限以及运行Web应用程序的组,并将图像数据传递给Apache用户,直接在HTML中进行分组。

唯一可能的弱点是您的网络应用运行的用户的密码。

是否已有可能?

5 个答案:

答案 0 :(得分:80)

其他(更好)的方法,在其他答案中描述,以保护您的文件,但是是的,可以将图像嵌入您的HTML。

以这种方式使用<img>标记:

<img src="data:image/gif;base64,xxxxxxxxxxxxx...">

xxxxx...部分是gif图像数据的base64编码。

答案 1 :(得分:11)

如果我在images目录上需要安全性,我根本不会公开该目录。相反,我的img src属性将引用一个将userid和image id作为参数的页面。

该页面将验证该用户确实有权查看该图片。如果一切顺利,请将二进制文件发回。否则什么都不发送。

例如:

<img src="imgaccess.php?userid=1111&imgid=223423" />

另外,我不会使用可猜测的id。而是坚持使用base 64编码guid的东西。

答案 2 :(得分:3)

我不确定我理解,但是这里有。而不是提供驻留在图像文件夹中的静态图像 - 为什么不能使用您选择的服务器端技术将图像动态发送到客户端?这样你的服务器端代码可以混合进入并以编程方式允许或拒绝访问?

<img src="/images/getImage.aspx?id=123353 />

答案 3 :(得分:1)

您可以将图片从文档根目录移动到私人目录中,然后通过您的应用程序传递它们,该应用程序可以访问该目录。每次您的应用生成图片代码时,它都会生成一个短期安全令牌,在访问特定图片时必须指定该令牌:

<img src="/app/getImage.xyz?image=12345&token=12a342e32b321" />

很有可能有人会在正确的时间使用正确的图像强行使用正确的令牌。 至少有可能在“getImage”中验证令牌:

  1. 跟踪应用中的所有图片代码,并将记录存储在数据库中,该数据库将随机生成的代币和图像ID链接到请求用户。然后,“getImage”操作将针对该数据库检查提供的参数。
  2. 将令牌作为校验和(MD5,CRC,等等)生成用户ID,图像ID以及一年中的当前日期,并确保混合使用不可思议的盐。然后,“getImage”操作将重新计算校验和,并将其与指定的校验和进行检查,以验证用户的访问权限。这种方法比第一种方法产生更少的开销。
  3. PHP示例:

    $token = md5($_SESSION['user_id'].' '.$imageID.' '.$SECRET_SALT.' '.date('z'));
    

答案 4 :(得分:0)

使用HTML5,您可以使用canvas标记和JavaScript来执行此操作。

您可以使用CSS或表布局来绘制图片(可能非常糟糕的性能,分辨率,可移植性)。

无论哪种方式,都没有阻止人们拍摄你的照片。他们可以截取屏幕截图并将其裁剪掉。

正如克里斯在他的回答中提到的那样,拥有长图片ID,因此每张图片的网址都不容易被猜到或者暴力非常重要。并且您的网络服务器目录中也没有目录列表。