1. 什么是图片防盗链
在互联网上,图片资源很容易被其他网站盗链,盗链是指从其他网站上直接引用图片资源而不是保存到自己的服务器上。这会导致服务器的带宽被浪费,使得原始图片的所有权和访问控制失去了意义。为了保护图片资源的安全性和合法性,我们需要对图片进行防盗链。
2. PHP实现图片防盗链的原理
实现图片防盗链的方法有很多种,其中基于服务器的防盗链是最常见的一种。PHP语言可以很方便地在服务器端进行图片地址的过滤和权限控制,实现图片防盗链的效果。
2.1. 获取请求的Referer
防盗链的关键在于判断请求的Referer(引用页面)是否为可信的来源。通过PHP代码,可以使用$_SERVER['HTTP_REFERER']
获取请求的Referer。
$referer = $_SERVER['HTTP_REFERER'];
2.2. 验证Referer的合法性
在接收到请求的Referer后,我们需要对其进行验证以判断其合法性。一种常见的方式是检查Referer是否为本站域名或者白名单中的域名,如果不是,则认为是盗链请求。
$validReferers = array('www.example.com', 'www.sample.com');
$refererDomain = parse_url($referer, PHP_URL_HOST);
if (!in_array($refererDomain, $validReferers)) {
header('HTTP/1.1 403 Forbidden');
exit();
}
在上述代码中,$validReferers
是一个白名单数组,包含了合法的Referer域名。通过parse_url($referer, PHP_URL_HOST)
函数,我们可以获取到Referer的域名部分,并使用in_array()
函数判断其是否在白名单中。如果不在白名单中,我们返回403 Forbidden状态码并终止脚本执行。
2.3. 输出图片内容
当验证通过后,我们可以将图片的二进制内容输出给浏览器,让浏览器显示图片。可以通过readfile()
函数读取并输出图片文件。
$imagePath = 'path/to/image.jpg';
header('Content-Type: image/jpeg');
readfile($imagePath);
在上述代码中,$imagePath
是图片文件的路径。通过设置header('Content-Type: image/jpeg')
,我们告诉浏览器输出的内容是JPEG格式的图片。然后使用readfile()
函数读取图片文件并输出。
3. 完整的图片防盗链代码示例
下面是一个完整的基于PHP语言的图片防盗链示例:
// 设置合法的Referer
$validReferers = array('www.example.com', 'www.sample.com');
// 获取请求的Referer
$referer = $_SERVER['HTTP_REFERER'];
$refererDomain = parse_url($referer, PHP_URL_HOST);
// 验证Referer的合法性
if (!in_array($refererDomain, $validReferers)) {
header('HTTP/1.1 403 Forbidden');
exit();
}
// 输出图片内容
$imagePath = 'path/to/image.jpg';
header('Content-Type: image/jpeg');
readfile($imagePath);
在上述代码中,我们首先定义了一个$validReferers
数组,包含合法的Referer域名。然后获取请求的Referer并验证其合法性,如果不合法,返回403 Forbidden状态码并终止脚本执行。最后输出图片的二进制内容,让浏览器显示图片。
通过以上代码,我们可以实现基于PHP的图片防盗链功能,保护图片资源的安全性和合法性。