是否有可能把二进制图像数据到HTML标记,然后在任何浏览器像平常一样显示图像?

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

一个简单的例子:

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

问题在于:有人可能会爬取您的服务器的图像目录。 但是你想保护你的用户免受这种攻击。

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

唯一可能的弱点就是你的web应用运行的用户的密码。

有没有可能?

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

这样使用<img>标签:

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

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

如果我需要我的图像目录的安全性,我不会公开目录。 相反,我的IMG SRC属性会引用一个页面,将一个用户ID和图像ID作为参数。

该页面将validation该用户的确有权访问该图片。 如果一切顺利的话,发回二进制文件。 否则不发送。

例如:

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

另外,我不会使用可猜测的ID。 而是坚持像基地64编码GUID的东西。

我不确定我是否理解,但是这里。 为什么你不能使用你select的服务器端技术将图像dynamic地发送到客户端呢? 这样你的服务器端代码可以混合,允许或拒绝访问编程?

 <img src="http://img.dovov.comgetImage.aspx?id=123353 /> 

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

你也许可以用CSS或表格布局来绘制图片(可能真的是糟糕的性能,分辨率和可移植性)。

无论哪种方式,没有停止的人拿你的照片。 他们可以截图并剪下来。

正如克里斯在他的回答中提到的那样,有很长一段时间的照片,所以每张照片的url都不容易被猜出,或者蛮力是很重要的。 你的web服务器目录上也没有目录列表。

您可以将图片从文档根目录移动到私人目录,并通过可以访问该目录的应用程序提供。 每次您的应用程序生成图像标记时,它也会生成一个短期的安全标记,访问特定图像时必须指定它:

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

机会非常罕见,有人会在正确的时间用正确的形象暴力的权利令牌。 至less有可能性来validation“getImage”中的令牌:

  1. 跟踪您的应用程序中的所有图像标签,并将logging存储在数据库中,该数据库将随机生成的令牌和图像ID链接到请求用户。 “getImage”操作然后检查提供的参数对该数据库。
  2. 生成令牌作为校验和(MD5,CRC,无论)在用户ID,图像ID,也许今年的当天,一定要混合在一个不可猜测的盐。 然后,“getImage”操作将重新计算校验和,并将其与指定的校验和进行核对,以validation用户的访问权限。 这种方法将产生比第一个更less的开销。

PHP示例:

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