nginx token 防盗链
在Web开发和运维领域,防盗链是一个常见的需求。为了防止其他网站未经授权直接引用或下载资源(如图片、视频等),我们可以使用Nginx的Token防盗链功能。这种机制通过生成一个临时的有效Token,并将其附加到URL中,确保只有合法的请求能够访问资源。介绍几种实现Nginx Token防盗链的方法。
1. 简单的时间戳+密钥签名方案
最基础的Token防盗链方式是使用时间戳和密钥进行签名验证。这种方式简单易懂,且易于实现。
代码示例:
nginx
http {
# 定义lua块,用于处理token验证
lua<em>shared</em>dict cache 10m;</p>
<pre><code>init_by_lua_block {
require "resty.md5"
}
server {
location /protected/ {
set $secret_key "your_secret_key";
set $expire_time 3600;
rewrite_by_lua_block {
local uri = ngx.var.uri
local args = ngx.req.get_uri_args()
local token = args["token"]
local timestamp = tonumber(args["t"])
if not token or not timestamp then
return ngx.exit(ngx.HTTP_FORBIDDEN)
end
-- 检查是否过期
if os.time() > timestamp then
return ngx.exit(ngx.HTTP_FORBIDDEN)
end
-- 生成校验值
local hash = ngx.md5($secret_key .. timestamp)
if hash ~= token then
return ngx.exit(ngx.HTTP_FORBIDDEN)
end
}
# 正常处理请求
proxy_pass http://backend;
}
}
}
2. 使用Nginx内置模块
Nginx自带了secure_link_module
模块,可以方便地实现基于Token的防盗链。这个方法不需要额外安装第三方库,配置也相对简单。
配置示例:
nginx
http {
server {
location /protected/ {
secure<em>link $arg</em>md5,$arg<em>expires;
secure</em>link<em>md5 "$secure</em>link<em>expires$uri your</em>secret_key";</p>
<pre><code> if ($secure_link = "") {
return 403;
}
if ($secure_link = "0") {
return 410;
}
proxy_pass http://backend;
}
}
}
secure_link
指令用于解析传入的参数。secure_link_md5
定义了Token的计算规则。- 当
secure_link
为空时返回403禁止访问;为0时表示链接已过期。
3. 结合后端服务动态生成Token
对于更复杂的场景,我们还可以让后端应用负责生成Token,并通过API接口提供给前端。这种方式使得Token的生成逻辑完全可控,并且可以根据业务需求灵活调整。
例如,在Node.js中生成Token:
javascript
const crypto = require('crypto');
function generateToken(url, expires) {
const secretKey = 'your_secret_key';
const md5 = crypto.createHash('md5');
md5.update(`${expires}${url}${secretKey}`);
return md5.digest('hex');
}
然后在HTML页面中构建带Token的URL:
html
<img src="/image.jpg?md5=${generateToken('/image.jpg', Date.now() + 3600)}&expires=${Date.now() + 3600}">
在Nginx中按照前面提到的方式进行验证即可。
以上就是关于Nginx Token防盗链的一些常见实现方法。根据实际应用场景的不同,可以选择最适合自己的方案。无论采用哪种方式,都建议定期检查并更新密钥,以保证安全性。