php怎么使用防盗链图片
时间 : 2023-03-27 21:29:01声明: : 文章内容来自网络,不保证准确性,请自行甄别信息有效性

在 Web 开发中,防盗链指的是网站针对其内容被嵌入到其他网站中的情况而采取的一些保护措施。常见的防盗链方式包括使用 HTTP Referer 和 token 验证等。在 PHP 中,我们可以使用以下两种方式来实现防盗链图片:

1. 使用 HTTP Referer

HTTP Referer 是一种 HTTP 请求头,用于指示当前请求的来源地址。因此,我们可以通过检查 HTTP Referer 头来验证请求是否来自我们的网站。如果 Referer 头不是我们的网站,则可以拒绝服务或返回替代图像等操作。示例代码如下:

```php

<?php

$referer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '';

$allowed_domains = array('example.com');

if ($referer == '' || !in_array(parse_url($referer, PHP_URL_HOST), $allowed_domains)) {

header('HTTP/1.1 403 Forbidden');

exit('403 Forbidden');

}

$image_path = 'path/to/image.jpg';

header('Content-Type: image/jpeg');

readfile($image_path);

在这个示例代码中,我们首先获取了 HTTP Referer 头并检查其来源域名是否为我们允许的域名。如果不是,则返回 403 Forbidden 状态码并退出程序。否则,我们设置了 Content-Type 为 image/jpeg 并读取图片文件并输出。这样,只有来自允许域名的请求才能正常访问图片。

2. 使用 token 验证

使用 token 验证相较于 HTTP Referer 方式更加灵活,因为我们可以自己定义 token 的生成方式和有效期等。可以通过在 URL 携带 token 来验证请求是否合法。当然,这需要我们在服务器端定义好 token 的生成函数和验证函数等。示例代码如下:

```php

<?php

define('TOKEN_EXPIRE', 3600); // token 有效期为 1 小时

function generate_token($image_path)

{

$timestamp = time();

$token = md5($timestamp . $image_path . 'your_secret_key');

return $token . '|' . $timestamp;

}

function validate_token($token, $image_path)

{

$now = time();

list($token_str, $timestamp) = explode('|', $token);

if ($timestamp + TOKEN_EXPIRE < $now) { // token 过期

return false;

}

if ($token_str != md5($timestamp . $image_path . 'your_secret_key')) { // token 不匹配

return false;

}

return true;

}

$image_path = 'path/to/image.jpg';

$token = isset($_GET['token']) ? $_GET['token'] : '';

if (!validate_token($token, $image_path)) { // token 无效

header('HTTP/1.1 403 Forbidden');

exit('403 Forbidden');

}

header('Content-Type: image/jpeg');

readfile($image_path);

在这个示例代码中,我们首先定义了 token 的生成函数和验证函数,然后在请求 URL 中携带 token 参数,并调用 validate_token 函数进行验证。如果验证失败,则直接返回 403 Forbidden 状态码。否则,我们同样进行图片输出等操作。

注意,这里我们使用了 md5 哈希算法对 token 进行加密。需要注意的是,如果我们使用固定的加密秘钥,则有可能被攻击者通过暴力***等方式获取到加密秘钥,并伪造 token 进行访问。这时我们可以考虑使用动态的加密秘钥,比如可以使用访问者 IP 地址等作为加密秘钥。

当我们在网站上使用图片时,可能会遇到盗链的问题。盗链即其他网站直接使用我们网站上的图片资源,而不是将其下载并上传到自己的服务器。这种行为在一定程度上会增加我们的服务器负载,同时也可能侵犯我们的版权。因此,我们可以通过一些技巧防止盗链。

下面,介绍一种使用 PHP 实现防盗链图片的方法。具体步骤如下:

1. 在图片所在的页面(例如 index.php)中添加以下代码:

<?php

$referer = $_SERVER['HTTP_REFERER'];

$allowed_referer = "www.yourwebsite.com"; // 允许的域名

if (strpos($referer, $allowed_referer) === false) {

// 如果来路不合法,显示另外一张图片

header("Content-Type:image/jpeg");

$image = file_get_contents("no_hotlinking.jpg");

echo $image;

exit;

}

?>

2. 把所需的图片文件命名为 "image.jpg",并将其放置在服务器上的目录中。

3. 修改 .htaccess 文件,添加以下重定向规则:

RewriteEngine On

RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{REQUEST_FILENAME} !-d

RewriteCond %{HTTP_REFERER} !^$

RewriteCond %{HTTP_REFERER} !yourwebsite\.com [NC]

RewriteRule ^image\.jpg$ no_hotlinking\.jpg [NC,R,L]

上述代码的含义是,如果来路不是我们指定的域名 (yourwebsite.com),则重定向到另一张图片 "no_hotlinking.jpg"。

这种方法的原理是通过 .htaccess 文件上的规则,检查 HTTP Referer 标头,从而确定请求是否来自允许的域名。如果不是,则重定向到另一张图片。

需要注意的是,这种方法只能防止非技术人员或者不太懂技术的人使用盗链行为,对于一些高级用户(比如黑客)可能还是无法避免的。因此,建议在加上其他的安全措施,比如图片水印等方式,保护图片资源的安全。