在 PHP 中,防止图片盗用和盗链是保护网站资源的重要手段。以下是两种常见的有效方法:
方法 1:使用 Referer 检查 防止盗链
通过检查请求的 Referer
头,判断请求是否来自合法域名。如果不是,则拒绝访问或返回错误提示。
实现步骤:
在图片访问的 PHP 脚本中,获取
Referer
头。检查
Referer
是否来自允许的域名。如果
Referer
不合法,返回错误提示或替代图片。
示例代码:
<?php// 允许的域名列表$allowed_domains = ['www.yourdomain.com', 'yourdomain.com'];// 获取 Referer$referer = $_SERVER['HTTP_REFERER'] ?? '';// 检查 Referer 是否合法$is_allowed = false;foreach ($allowed_domains as $domain) { if (strpos($referer, $domain) !== false) { $is_allowed = true; break; }}// 如果 Referer 不合法,返回错误提示或替代图片if (!$is_allowed) { header('HTTP/1.1 403 Forbidden'); echo '禁止访问:图片仅限本站使用!'; exit;}// 如果合法,输出图片$image_path = 'path/to/your/image.jpg';header('Content-Type: image/jpeg');readfile($image_path);?>
优点:
简单易实现。
可以有效防止直接盗链。
缺点:
Referer
头可以被伪造。如果用户浏览器禁用了
Referer
,合法用户可能无法访问图片。
方法 2:使用 动态 URL + Token 验证 防止盗用
通过生成动态的图片 URL,并在 URL 中包含一个加密的 Token,验证 Token 的合法性来防止盗用。
实现步骤:
生成一个加密的 Token,包含时间戳和图片路径等信息。
将 Token 附加到图片 URL 中。
在访问图片时,验证 Token 是否合法。
示例代码:
生成图片 URL:
<?phpfunction generate_image_url($image_path) { $secret_key = 'your_secret_key'; // 加密密钥 $timestamp = time(); // 当前时间戳 $token = md5($secret_key . $image_path . $timestamp); // 生成 Token // 返回带 Token 的图片 URL return "https://www.yourdomain.com/get_image.php?path=" . urlencode($image_path) . "&token=$token&t=$timestamp";}// 示例:生成图片 URL$image_url = generate_image_url('path/to/your/image.jpg');echo "<img src='$image_url' alt='Protected Image'>";?>
验证 Token 并输出图片:
<?php$secret_key = 'your_secret_key'; // 加密密钥// 获取 URL 参数$image_path = urldecode($_GET['path'] ?? '');$token = $_GET['token'] ?? '';$timestamp = $_GET['t'] ?? 0;// 验证 Token 是否合法$expected_token = md5($secret_key . $image_path . $timestamp);if ($token !== $expected_token || (time() - $timestamp) > 3600) { // Token 有效期 1 小时 header('HTTP/1.1 403 Forbidden'); echo '禁止访问:图片链接已过期或无效!'; exit;}// 如果合法,输出图片header('Content-Type: image/jpeg');readfile($image_path);?>
优点:
安全性高,Token 难以伪造。
可以设置 Token 的有效期,防止链接被长期盗用。
缺点:
实现稍复杂。
需要动态生成图片 URL,可能增加服务器负担。
方法 3:结合 .htaccess 文件 防止盗链(适用于 Apache 服务器)
通过 Apache 的 .htaccess
文件,直接限制图片的访问来源。
实现步骤:
在图片目录下创建
.htaccess
文件。配置
.htaccess
,限制访问来源。
示例 .htaccess
文件:
RewriteEngine On RewriteCond %{HTTP_REFERER} !^https://(www\.)?yourdomain\.com/ [NC] RewriteCond %{HTTP_REFERER} !^https://(www\.)?anotherapproveddomain\.com/ [NC] RewriteRule \.(jpg|jpeg|png|gif)$ - [F,NC]
解释:
RewriteCond
:检查Referer
是否来自允许的域名。RewriteRule
:如果Referer
不合法,返回 403 禁止访问。
优点:
直接在服务器层面实现,无需修改 PHP 代码。
性能较好。
缺点:
仅适用于 Apache 服务器。
Referer
头可以被伪造。
方法 4:使用 水印 防止图片盗用
在图片上添加水印,即使图片被盗用,也能追踪来源或起到警示作用。
实现步骤:
使用 PHP 的 GD 库或 ImageMagick 库为图片添加水印。
在输出图片时动态添加水印。
示例代码:
<?php// 加载原始图片$image = imagecreatefromjpeg('path/to/your/image.jpg');// 加载水印图片$watermark = imagecreatefrompng('path/to/watermark.png');// 获取水印图片的宽度和高度$watermark_width = imagesx($watermark);$watermark_height = imagesy($watermark);// 将水印添加到原始图片上$dest_x = imagesx($image) - $watermark_width - 10; // 水印位置:右下角$dest_y = imagesy($image) - $watermark_height - 10;imagecopy($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height);// 输出带水印的图片header('Content-Type: image/jpeg');imagejpeg($image);// 释放内存imagedestroy($image);imagedestroy($watermark);?>
优点:
即使图片被盗用,也能通过水印追踪来源。
对用户体验影响较小。
缺点:
水印可能被裁剪或覆盖。
增加服务器处理负担。
总结
方法 | 优点 | 缺点 | 适用场景 |
---|---|---|---|
Referer 检查 | 简单易实现 | Referer 可伪造,浏览器可能禁用 Referer | 简单的防盗链需求 |
动态 URL + Token 验证 | 安全性高,可设置有效期 | 实现复杂,增加服务器负担 | 高安全性需求的防盗链 |
.htaccess 文件 | 服务器层面实现,性能好 | 仅适用于 Apache,Referer 可伪造 | Apache 服务器的防盗链需求 |
水印 | 可追踪来源,对用户体验影响小 | 水印可能被裁剪,增加服务器负担 | 防止图片盗用 |
根据实际需求,可以选择一种或多种方法结合使用,以达到最佳的防盗效果。
希望以上内容对你有所帮助!如果还有其他问题,请随时提问。 各类知识收集 拥有多年CMS企业建站经验,对 iCMS, LeCMS, ClassCMS, Fastadmin, PbootCMS, PHPCMS, 易优CMS, YzmCMS, 讯睿CMS, 极致CMS, Wordpress, HkCMS, YznCMS, WellCMS, ThinkCMF, 等各类cms的相互转化,程序开发,网站制作,bug修复,程序杀毒,插件定制都可以提供最佳解决方案。