圖片及目錄防盜鏈解決方案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