这是一个重要的安全问题,我相信这应该是可能的。
一个简单的例子:
您运行社区门户。用户已注册并上传他们的照片。 只要允许显示图片,您的应用程序就会提供安全规则。例如,用户必须是系统各方的朋友,以便您可以查看其他人上传的图片。
问题出现了:有人可能会抓取您服务器的图像目录。但是您希望保护您的用户免受此类攻击。
如果可以将图像的二进制数据直接放入HTML标记中,则可以限制用户对用户的访问权限以及运行Web应用程序的组,并将图像数据传递给Apache用户,直接在HTML中进行分组。
唯一可能的弱点是您的网络应用运行的用户的密码。
是否已有可能?
答案 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”中验证令牌:
PHP示例:
$token = md5($_SESSION['user_id'].' '.$imageID.' '.$SECRET_SALT.' '.date('z'));
答案 4 :(得分:0)
使用HTML5,您可以使用canvas标记和JavaScript来执行此操作。
您可以使用CSS或表布局来绘制图片(可能非常糟糕的性能,分辨率,可移植性)。
无论哪种方式,都没有阻止人们拍摄你的照片。他们可以截取屏幕截图并将其裁剪掉。
正如克里斯在他的回答中提到的那样,拥有长图片ID,因此每张图片的网址都不容易被猜到或者暴力非常重要。并且您的网络服务器目录中也没有目录列表。