图片及目录防盗链解决方案javascript
什么是防盗链 简单的说,就是某些不法网站,经过在其自身网站程序里未经许可非法调用其它网站的资源,而后在本身的网站上显示这些调用的内容,
达到填充自身网站显示的效果,可是消耗了了源站的网络流量,形成其余网站的带宽及服务压力吃紧,甚至宕机(图片水印,防火墙,防盗链) 网站资源被盗链带来的问题 最直接的影响就是网络带宽占用加大了,带宽费用损失,监控软件告警,服务器压力加大,甚至网站的正经常使用户访问也受到影响 如何及时发现盗链? 1、对IDC及CDN带宽作监控 2、做为高级运维或运维经理,天天上班的一个重要任务,就是常常查看网站流量图,关注流量变化与异常流量 3、访日日志分析,对于异常流量迅速定位,而且与市场推广有较好沟通,以便调度带宽和服务器资源,确保网站正常访问体验获得保证。
常见的防盗链解决方案的基本原理php
1、根据http referer实现防盗链 在HTTP协议中,有个表头字段叫referer,使用URL格式来表示从哪里来的连接到当前网页的资源,经过referer能够检测目标访问的来源网页,
若是是资源文件,能够跟踪到显示它的网页地址,一旦检测出来源不是本站,立刻进行阻止或返回指定的页面 HTTP Reffer是header的一部分,当浏览器向web服务器发送请求的时候,通常会带上Referer,告诉服务器是从哪一个页面连接过来的,
服务器借此能够得到一些信息用于处理。Apache、Nginx、Lighttpd三者都支持根据此指令实现防盗链,目前referer是网站图片、附件、html等最经常使用的防盗链手段。
提示:nginx模块ngx_http_referer_module一般用于阻挡来源非法的域名请求.咱们应该牢记,假装Referer头部是很是简单的事情,因此这个模块只能用于阻止大部分非法请求.咱们应该记住,有些合法的请求是不会带referer来源头部的,因此有时候不要拒绝来源头部(referer)为空的请求.
location ~* \.(gif|jpg|png|bmp)$ {
valid_referers none blocked *.ttlsa.com server_names ~\.google\. ~\.baidu\.;
if ($invalid_referer) {
return 403;
#rewrite ^/ http://www.ttlsa.com/403.jpg;
}
}
以上全部来至ttlsa.com和域名中包含google和baidu的站点均可以访问到当前站点的图片,若是来源域名不在这个列表中,那么$invalid_referer等于1,在if语句中返回一个403给用户,这样用户便会看到一个403的页面,若是使用下面的rewrite,那么盗链的图片都会显示403.jpg。若是用户直接在浏览器输入你的图片地址,那么图片显示正常,由于它符合none这个规则.
二、根据cookie防盗链
经过ActiveX显示的内容不向服务器提供Referer Header(例如,Flash,WindowsMedia视频等)
ActiveX插件不传递Referer,可是却忠实的传递Cookie。因而在显示ActiveX的页面的<head> </head>标签内嵌入一段代码:
<script> document.cookie=”Cache=vod;domain=domain.com;path=/”; </script>
这段代码用 javascript 设置了一段 Cookie: Cache=vod
而后经过各类ACL来判断这个Cookie的存在以及验证其值的操做了
三、经过加密变换访问路径实现防盗链
lighttpd有相似的插件 mod_secdownload
四、Nginx web服务经过referer实现防盗链
a、利用referer而且针对扩展名rewrite重定向
location ~* \.(wma|wmv|asf|mp3|mmf|zip|rar|jpg|gif|png|swf|flv)$ {
valid_referers none blocked *.lvnian.com lvnian.com;
if ($invalid_referer)
{
#rewrite ^/ http://www.765h.com/error.html;
return 403;
}
}
提示:根据本身公司实际业务进行域名设置(外链合做)
b、利用referer而且针对站点目录过滤返回错误代码
location /img/ {
root /data/img/;
valid_referers none blocked *.lvnian.com lvnian.com;
if ($invalid_referer) {
rewrite ^/ http://www.lvnian.com/error.gif;
#return 403;
}
}
五、Nginx的HttpAccessKeyModule实现防盗链
六、产品设计上解决防盗链,为网站上传图片增长水印
配置错误页面优雅显示html
在网站运行过程当中,可能因为页面不存在或者系统过载等缘由,致使网站没法正常响应用户请求,此时web服务默认会返回默认的错误代码,或者不友好的页面 咱们能够将40四、403等错误信息页面重定向到网站首页或者其余事先指定的页面,提高用户体验 server { listen 80; server_name www.gtms.org; location / { root html/www; index index.html index.htm; } error_page 403 /403.html error_page 404 /404.html error_page 404 http://www.gtms.org } 扩展(天猫) error_page 500 501 502 503 504 http://XXX/error2.html error_page 400 403 404 405 408 410 411 412 413 414 415 http://XXX/error1.html
nginx站点目录文件及目录权限优化java
单机LNMP环境目录权限严格控制措施 为了保证网站不遭受木马入侵,全部站点目录的用户和组都应该为root,全部目录权限设置为755,全部文件权限是644,而后把用户上传资源的目录权限设置为755 ,用户和组设置为nginx服务的用户,最后针对上传资源的目录作资源访问控制 大多数公司的不安全的受权以下: 1)chmod -R 777 /sitedir(最不安全) 2) chmod -R nginx.nginx /sitedir(最不安全) 若是大多数公司受权通常的受权,会给网站带来最大的安全隐患,特别是木马入侵 在较好的网站业务架构中,应把资源文件,包括用户上传的图片、附件等服务和程序服务分离,最好把上传程序服务也分离,这样能够从容按照前面安全的标准受权了
防爬虫优化(开发管)node
Nginx防蜘蛛爬虫处理 假定一个场景:某个网站它可能不但愿被网络爬虫抓取,例如测试环境不但愿被抓取,以避免对用户形成误导,那么须要在该网站中申明,本站不但愿被抓取。有以下方法: 方法一:修改nginx.conf,禁止网络爬虫的ua,返回403。 server { listen 80; server_name 127.0.0.1; #添加以下内容便可防止爬虫 if ($http_user_agent ~* " qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google|Adsbot-Google|Feedfetcher-Google|Yahoo! Slurp|Yahoo! Slurp China|YoudaoBot|Sosospider|Sogou spider|Sogou web spider|MSNBot|ia_archiver|Tomato Bot") { return 403; } 方法2:网站更目录下增长Robots.txt,放在站点根目录下。 在http://tool.chinaz.com/robots/站点能够针对如今的搜索引擎按照想要的规则生成robots.txt文件。 知识扩展: robots.txt是搜索引擎中访问网站的时候要查看的第一个文件。robots.txt文件告诉蜘蛛程序在服务器上什么文件是能够被查看的。 当一个搜索蜘蛛访问一个站点时,它会首先检查该站点根目录下是否存在robots.txt,若是存在,搜索机器人就会按照该文件中的内容来肯定访问的范围;
若是该文件不存在,全部的搜索蜘蛛将可以访问网站上全部没有被口令保护的页面。百度官方建议,仅当您的网站包含不但愿被搜索引擎收录的内容时,才须要使用robots.txt文件。若是您但愿搜索引擎收录网站上全部内容,请勿创建robots.txt文件。 Robots协议是国际互联网界通行的道德规范,基于如下原则创建: 1、搜索技术应服务于人类,同时尊重信息提供者的意愿,并维护其隐私权; 2、网站有义务保护其使用者的我的信息和隐私不被侵犯。 固然,若是搜索引擎不遵照约定的Robots协议,那么经过在网站下增长robots.txt也是不起做用的。(在正式环境中,能够适当容许搜索引擎抓取收录)
利用nginx限制http的请求方法nginx
其中最经常使用的http方法为GET、POST,咱们能够经过nginx限制http请求的方法来达到提高服务器安全的目的,例如,让http只能使用GET、HEAD和POST方法的配置以下 if ($request_method !~ ^(GET|HEAD|POST)$ ) { return 501; } #能够控制对设置针对某几个php不能get 在上传服务器其上限制HTTP的GET方法配置以下 if ($request_method !~ ^(GET)$ ) { return 501; }#还能够加一层location更具体的显示文件名
使用CDN作网站内容加速web
CDN的全称是Content Delivery Network,即内容分发网络。(网宿、蓝讯、快网) 简单的讲,经过现有的internet中增长一层新的网络架构,将网站的内容发布到最接近用户的cache服务器,经过只能DNS负载均衡技术,
判断用户的来源,让用户就近使用和服务器相同线路的带宽访问cache服务器取得所需内容,例如:天津网通用户访问田间网通cache服务器上的内容,北京电信访问北京电信cache服务器上的内容,
这样能够减小数据在网络上传输的时间,提升访问速度 CDN产生背景之一 BGP机房虽然能够提高用户体验,可是价格昂贵,对于用户来讲,CDN的诞生能够提供比机房更好的体验(让同一地区、同一线路的用户访问和当地的网站)。
BGP机房和普通机房有将近5-10倍的价格差。CDN多使用单线的机房,根据用户的线路以及位置,为用户选择靠近用户位置以及相同的运营商线路,不但提高了用户体验,价格也降下来了。 CDN的价值 1、为架设网站的用户省钱 2、提高企业网站用户的访问体验(相同线路、相同地域、内存访问) 3、能够阻挡大部分流量攻击,例如DDOS 100万PV架构设计思路:首先应该尽可能考虑把网站数据放到CDN中的缓存,这样计算网站总流量总访问量减去CDN的访问流量后,剩下的访问量规模须要的架构才是咱们须要设计考虑的,一个良好的网站架构设计,访问量尽可能都交给CDN
为网站程序解耦浏览器
解耦是开发人员中流行的一个名词,简单的说就是把一堆程序代码按照业务用途分开,而后提供服务,
例如:注册登陆、上传、下载、浏览列表、商品内容页面、订单支付等都应该是独立的程序服务、只不过在客户端看来是一个总体而已。
若是中小公司作不到上述细致的解耦,起码也要让下面的几个程序模块独立 1、网页页面服务 2、图片附件及下载服务 3、上传图片服务 上述三者的功能尽可能分离
解决普通端口非80提供服务的问题缓存
用lb解决web服务非80端口的转换问题(haproxy、nginx、f5) 本解决方案优势 1、给nginx服务降权,让网站更安全 2、按用户设置站点权限,使站点更独立 3、开发不须要用root便可完整的管理服务器及站点 4、可实现对责任的划分:网络问题属于运维责任,网站打不开就是开发责任或共同承担
控制nginx并发链接数量安全
Module ngx_http_limit_conn_module 此模块用于限制每一个定义的key值得链接数,特别是单IP的链接数,不是全部的链接数都被计数,一个符合要求的链接时一个由服务器处理的请求,整个请求头已经被读取 1、限制单IP并发链接数(可用于down限制) http { limit_conn_zone $binary_remote_addr zone=addr:10m; ... server { ... location /download/ { limit_conn addr 1; } # allow only one connection per an IP address at a time. Syntax: limit_conn_zone key zone=name:size; Default: — Context: http 设置共享内存区域,key能够是字符串、nginx自有变量或者二者组合,如$binary_remote_addr、$server_name。name为内存区域的名称,size为内存区域的大小。 Syntax: limit_conn zone number; Default: — Context: http, server, location 为指定key设置最大并发链接数,超过期返回503 #测试并发链接3,访问10次ab -c 3 -n 10 http://ip #测试并发链接1,访问10次ab -c 1 -n 10 http://ip
限制虚拟主机总链接数
不只能够限制单IP的并发链接数,还能够限制虚拟主机总链接数,能够同时使用 limit_conn_zone $binary_remote_addr zone=perip:10m; limit_conn_zone $server_name zone=perserver:10m; server { ... limit_conn perip 10; limit_conn perserver 100; 提示:nginx内部变量表http://nginx.org/en/docs/varindex.html
控制客户端请求nginx的速率
此模块用于限制每一个IP访问每一个定义key的请求速率 http { limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; #定义共享区 ... server { ... location /search/ { limit_req zone=one burst=5; #使用定义的one内存空间,队列值5,即5个请求排队等待 } } Syntax: limit_req_zone key zone=name:size rate=rate; Default: — Context: http 设置共享内存区域,key能够是字符串、nginx自有变量或者二者组合,如$binary_remote_addr、$server_name。name为内存区域的名称,size为内存区域的大小。rate为速率,单位为r/s,每秒一个请求 Syntax: limit_req zone=name [burst=number] [nodelay]; Default: — Context: http, server, location 运用了令牌桶原理,burst=number,一共有num块令牌,发完后,多出来的请求就会返回503 换句话说,一个银行,只有一个营业员,银行很小,等候室只有5我的的位置。所以营业员一个时刻只能为一我的提供服务,剩下的不超过5我的能够在银行内等待,超出的人直接不提供服务,返回503 nodelay默认在不超过burst值得状况下会排队等待处理,就会处理完num+1次请求,剩余都视为超时503 #测试并发链接3,访问10次ab -c 6 -n 10 http://ip