如何禁止外链和屏蔽地区,nginx能做到吗?
什么是外链?为什么需要禁止外链?
外链(也称之为盗链)是指其他网站或者在别的场所上(如论坛、博客)嵌入你站点的图片、Flash等资源。禁止外链可以避免带宽被攻击者盗用、提高访问速度、保护版权资源、防范某些恶意攻击。
nginx如何禁止外链?
禁止外链的方式有很多种,其中较为实用的方式是直接修改 nginx 的配置文件。通过在配置文件中添加以下代码,可以实现直接禁止非本站访问的资源:
if ($http_referer ~* (\\.css|\\.js|\\.png|\\.jpg|\\.gif)) {
# 表示该文件不允许被其他网站 iframe 的方式引用
return 403;
}
如何防止被篡改、伪造来源?
简单地比对来源可能会出现被篡改、伪造的情况。更为科学的方式是通过 token(密钥)的方式进行验证,只有当请求中带有密钥时,才能通过验证。可以通过以下代码来生成请求的 token:
$token = md5($secret_key . $cdn_url . $allow_domains_list);
什么情况下需要屏蔽地区?如何屏蔽地区?
有一些特定地区非常容易产生恶意攻击,甚至可能会造成损失。在这种情况下,需要屏蔽特定的地区或 IP 以确保安全。通过 nginx 的 GeoIP 功能即可轻松实现,只需在配置文件中定义禁止的地区即可,例如:
if ($allowed_country ~ \"CN\") {
return 403;
}
如何灵活应对不同场景的需求?
不同的需求可能需要不同的方式进行设置,可以通过自定义 nginx 的配置文件来实现灵活变换配置。同时,还可以针对不同的需求制定各自的开关,方便快速启停某些功能。例如:
location /cdn {
\tif ($cdn_access) {
# 输入了 getCdnToken 必须有一个有限期
# 因为这里是 token+timestamp 相加,如果不加时间限制这里很容易过期访问
# 如果过了时间直接返回 403就好了
access_by_lua_block {
local valid_timestamp=ngx.time() + 300;
local encrypted_key=ngx.md5(ngx.var.secret..ngx.var.args..valid_timestamp);
ngx.var.token=encrypted_key..\"|\"..valid_timestamp;
}
\t}
\tadd_header Content-Type text/plain;
\treturn 200 $token;
}
location /demo {
\tif ($demo_loc_mode_enable) {
return 403;
\t}
\treturn 200 'ok';
}
通过以上技巧,可以轻松地对 Nginx 进行所需的外链禁用以及区域屏蔽等常见功能的设置。这一功能的实现对于网站的正常运营和安全性具有至关重要的作用。