标题索引
-
追溯原因
-
数据测试
-
防盗结构
追溯原因
一步一印,有印为证,网站资源防盗链老生常谈,但是如何才能确保网站资源如图片等特殊资源不被盗链?这不仅仅是运维人员所考虑的问题,更是开发人员必须控制并解决的一个问题,但因爬虫、浏览器插件和开发人员自行伪造http_referer等等技术原因,单纯服务器端设置防盗链远远无法解决此问题,参考相关资料决定从架构的角度根本上解决防盗链(另外通过referer记录请求资源从哪个网页链接过来的,从而可统计百度推广链接的次数等)。
数据测试
实验目的:测试http携带referer时的条件
测试拓扑:见图1-1
图1-1 测试拓扑
测试配置:服务器配置Nginx服务,在Nginx服务中配置两站点,并在站点www.a.com中映射资源a.jpg,站点www.b.com盗链www.a.com中的a.jpg资源,具体配置如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
[ root@server conf.d ] #pwd
/etc/nginx/conf .d
[ root@server conf.d ] #vim virtual.conf
server {
listen 80;
index index.html;
server_name www.a.com;
root /app/website01/ ;
location /admin {
return 403
}
}
server {
listen 80;
index index.html;
server_name www.b.com;
root /app/website02/ ;
location /admin {
return 403
}
}
[ root@server ~ ] #mkdir /app/website01
[ root@server ~ ] #echo "Welcome to website01" > /app/website01/index.html
[ root@server ~ ] #cp /data/picture/a.jpg /app/website01/
[ root@server ~ ] #mkdir /app/website02
[ root@server ~ ] #echo "Welcome to website02" > /app/website02/index.html
[ root@server ~ ] #echo "<img src=http://www.a.com/a.jpg" >> /app/website02/index.html
|
测试方法1:客户端直接访问www.b.com/a.jpg资源,测试结果为请求报头中无referer信息,具体见图1-2
图1-2 客户端直接请求资源抓包分析图
测试方法2:客户端访问www.a.com资源,然后通过www.a.com中的链接文件进入www.b.com网站,测试结果为请求包头中有referer信息,表明盗链地址来源,见图1-3
图1-3:客户端盗链网站资源抓包分析图
测试说明:以如下方式浏览在http请求报文头部中无referer信息
1.用户直接输入网站,http请求报文中无referer信息;
2.通过浏览器插件,修改referer后,http请求报文无referer信息;
3.通过https跳转至http中,http请求报文无referer信息。
防盗结构
根据上述测试可知,用户在盗链时可以http头部携带referer参数,因此在防盗链时总体设计思路如下:
1.服务器端开启有效referer请求配置,非有效referer则返回错误403或错误404状态码;
2.服务器端设置有效referer后,防止客户端伪造有效referer,如网站运行百度推广或通过百度打开企业网站,因 此企业web搭建时将www.baidu.com列如有效referer,故客户端伪造www.baidu.com的referer进行盗链。
总上上述防盗链设计思路,设计网站结构如下,也是当下互联网企业常用技术方案之一,Web服务器资源动静分离,图片采用独立的分布式存储。拓扑图如下:
当然对外服务器端需配合http_referer_module更加安全可靠, 具体配置可参考如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
[ root@server conf.d ] #vim virtual.conf
server {
listen 80;
index index.html;
server_name www.a.com;
root /app/website01/ ;
location / {
valid_referers none blocked server_names
#通配符,只要满足如下通配符即可
*.a.com example.* www.a.com
#正则表达式,定义模式\.baidu\.只要匹配此模式就允许通过
~\.baidu\.;
if ($invalid_referer) {
return 403;
#或者跳转到其他页面
#rewrite .* http://www.a.com/403.html
}
}
location /admin {
return 403
}
}
|