我想知道是否有人可以为我提供制作方法的教程或源代码,所以如果人们窃取我的网站图像并将它们嵌入他们的论坛或网站,它会显示一个水印,但如果他们在我的网站上查看它他们不会是水印吗?
3 回答
尽管 Piskvor 是 100% 正确的,但我只想添加如何在 PHP 中获取引用者。
用于$_SERVER['HTTP_REFERER']
获取客户端发送的Referer头。如果您的网站是“www.example.com”,则引荐来源网址应始终使用“www.example.com”作为域名。
现在,为了验证域名,让我们parse_url()
将 URL 解析为一个数组,并提取不同的部分。它返回一个数组,我们称之为 this $url
,并获取域名,使用$url['host']
。现在将其与您自己的域名进行比较,以确保它在您的域中。
完整示例:
$referrer = $_SERVER['HTTP_REFERER'];
$url = parse_url($referrer);
if($url['host'] == 'www.example.com')
{
// Is from www.example.com
}else{
// Is from other website
}
首先,小绕道进入 HTTP
HTTP 本质上是 Web 的核心协议——用于传输超文本(网页)、图像和其他媒体。从一开始,HTTP 就被设计为无状态的——除其他外,这意味着无法确定对图像的请求是否“属于”一个页面或另一个页面。
在 HTTP 中基本上有两种解决方法,但都不是 100% 可靠的:cookie 和 Referer 标头。
使用 cookie,您可以在用户访问您的页面时设置一个 cookie,然后在提供图像时检查它。这在第一次进入页面时可能会遇到并发问题。
使用Referer
,浏览器向图像请求发送一个 URL,从该 URL 加载图像。不幸的是,用户或安全软件可以轻松地修改或删除引用。
这对你意味着什么
我建议你使用 Referer 字段——虽然它不是 100% 可靠的,但大多数人不会费心去弄乱它,而那些会打扰的人,好吧,他们会克服任何其他保护。
您需要通过脚本(例如 PHP)提供图像。
http://example.com/img.php?id=12345 - 检查的伪代码,水印本身的 PHP:
check if the image with given ID exists, else throw a 404 and end
check the referer - if it matches your site, just readfile() the relevant image and exit
if we're here, referer is wrong - you'll need the watermark:
// PHP code from now on
$original = imagecreatefromjpeg($original_image_path);
$watermark = imagecreatefromjpeg($watermark_image_path);
imagecopymerge ( $original, $watermark, 0,0,0,0, $watermark_width, $watermark_height, $opacity);
header('Content-Type: image/jpeg');
imagejpeg($original);
exit;
对于大图像,Piskvor 的答案在服务器资源上过于繁重。还可能存在客户端缓存影响,不必要地增加延迟。
相反,我会在 .htaccess 文件中实现引荐检测,以便在引荐中使用您的域名或空引荐的所有请求直接进入图像,无需 PHP 处理。任何其他情况都意味着热链接,因此将提供水印脚本。