Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
單有效的防盜鏈手段
如果做過個人站點的同學,可能會遇到別人盜用自己站點資源鏈接的情況,這就是盜鏈。說到盜鏈就要說一個 HTTP 協議的 頭部,referer 頭部。當其他網站通過 URL 引用了你的頁面,用戶在瀏覽器上點擊 URL 時,HTTP 請求的頭部會通過 referer 頭部將該網站當前頁面的 URL 帶上,告訴服務器本次請求是由誰發起的。
例如,在谷歌中搜索 Nginx 然后點擊鏈接:
在打開的新頁面中查看請求頭會發現,請求頭中包含了 referer 頭部且值是 https://www.google.com/。
像谷歌這種我們是允許的,但是有一些其他的網站想要引用我們自己網站的資源時,就需要做一些管控了,不然豈不是誰都可以拿到鏈接。
這里目的其實已經很明確了,就是要拒絕非正常的網站訪問我們站點的資源。
要實現上面的目的,referer 模塊可得算頭一號,一起看下 referer 模塊怎么用的。
referer 模塊有三個指令,下面看一下。
Syntax: valid_referers none | blocked | server_names | string ...;
Default: —
Context: server, location
Syntax: referer_hash_bucket_size size;
Default: referer_hash_bucket_size 64;
Context: server, location
Syntax: referer_hash_max_size size;
Default: referer_hash_max_size 2048;
Context: server, location
這里面最重要的是 valid_referers 指令,需要重點來說明一下。
可以同時攜帶多個參數,表示多個 referer 頭部都生效。
參數值
invalid_referer 變量
下面來看一個配置文件。
server {
server_name referer.ziyang.com;
listen 80;
error_log logs/myerror.log debug;
root html;
location /{
valid_referers none blocked server_names
*.ziyang.com www.ziyang.org.cn/nginx/
~\.google\.;
if ($invalid_referer) {
return 403;
}
return 200 'valid\n';
}
}
那么對于這個配置文件而言,以下哪些請求會被拒絕呢?
curl -H 'referer: http://www.ziyang.org.cn/ttt' referer.ziyang.com/
curl -H 'referer: http://www.ziyang.com/ttt' referer.ziyang.com/
curl -H 'referer: ' referer.ziyang.com/
curl referer.ziyang.com/
curl -H 'referer: http://www.ziyang.com' referer.ziyang.com/
curl -H 'referer: http://referer.ziyang.com' referer.ziyang.com/
curl -H 'referer: http://image.baidu.com/search/detail' referer.ziyang.com/
curl -H 'referer: http://image.google.com/search/detail' referer.ziyang.com/
我們需要先來解析一下這個配置文件。valid_referers 指令配置了哪些值呢?
valid_referers none blocked server_names
*.ziyang.com www.ziyang.org.cn/nginx/
~\.google\.;
下面就實際看下響應:
# 返回 403,沒有匹配到任何規則
? ~ curl -H 'referer: http://www.ziyang.org.cn/ttt' referer.ziyang.com/
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.17.8</center>
</body>
</html>
? ~ curl -H 'referer: http://image.baidu.com/search/detail' referer.ziyang.com/
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.17.8</center>
</body>
</html>
# 匹配到了 *.ziyang.com
? ~ curl -H 'referer: http://www.ziyang.com/ttt' referer.ziyang.com/
valid
? ~ curl -H 'referer: http://www.ziyang.com' referer.ziyang.com/
valid
# 匹配到了 server name
? ~ curl -H 'referer: http://referer.ziyang.com' referer.ziyang.com/
valid
# 匹配到了 blocked
? ~ curl -H 'referer: ' referer.ziyang.com/
valid
# 匹配到了 none
? ~ curl referer.ziyang.com/
valid
# 匹配到了 ~\.google\.
? ~ curl -H 'referer: http://image.google.com/search/detail' referer.ziyang.com/
valid
referer 模塊是一種簡單的防盜鏈手段,必須依賴瀏覽器發起請求才會有效,如果攻擊者偽造 referer 頭部的話,這種方式就失效了。
secure_link 模塊是另外一種解決的方案。
它的主要原理是,通過驗證 URL 中哈希值的方式防盜鏈。
基本過程是這個樣子的:
原理如下:
模塊:
Syntax: secure_link expression;
Default: —
Context: http, server, location
Syntax: secure_link_md5 expression;
Default: —
Context: http, server, location
Syntax: secure_link_secret word;
Default: —
Context: location
命令行生成安全鏈接
echo -n '時間戳URL客戶端IP密鑰' | openssl md5 -binary | openssl base64 | tr +/ - | tr -d =
/test1.txt?md5=md5生成值&expires=時間戳(如 2147483647)
Nginx 配置
下面是一個實際的配置文件,我這里就不做演示了,感興趣的可以自己做下實驗。
server {
server_name securelink.ziyang.com;
listen 80;
error_log logs/myerror.log info;
default_type text/plain;
location /{
secure_link $arg_md5,$arg_expires;
secure_link_md5 "$secure_link_expires$uri$remote_addr secret";
if ($secure_link = "") {
return 403;
}
if ($secure_link = "0") {
return 410;
}
return 200 '$secure_link:$secure_link_expires\n';
}
location /p/ {
secure_link_secret mysecret2;
if ($secure_link = "") {
return 403;
}
rewrite ^ /secure/$secure_link;
}
location /secure/ {
alias html/;
internal;
}
}
除了上面這種相對復雜的方式防盜鏈,還有一種相對簡單的防盜鏈方式,就是只對 URI 進行哈希,這樣當 URI 傳
命令行生成安全鏈接
Nginx 配置
這個防盜鏈的方法比較簡單,那么具體是怎么用呢?大家都在網上下載過資源對吧,不管是電子書還是軟件,很多網站你點擊下載的時候往往會彈出另外一個頁面去下載,這個新的頁面其實就是請求的 Nginx 生成的安全 URL。如果這個 URL 被拿到的話,其實還是可以用的,所以需要經常的更新密鑰來確保 URL 不會被盜用。
者:Java3y
原文:轉載自微信公眾號,Java3y
只有光頭才能變強。
文本已收錄至我的GitHub倉庫,歡迎Star:https://github.com/ZhongFuCheng3y/3y
我們絕大多數的Web應用都是基于HTTP來進行開發的。我們對Web的操作都是通過HTTP協議來進行傳輸數據的。
簡單來說,HTTP協議就是客戶端和服務器交互的一種通迅的格式。
HTTP的誕生主要是為了能夠讓文檔之間相互關聯,形成超文本可以互相傳閱
可以說,Http就是Web通信的基礎,這是我們必學的。
我們學計算機網絡的時候就知道,我們把計算機網絡分層了5層,一般我們現在用的都是TCP/IP這么一個分層結構。
雖然官方的是ISO 提出的7層結構,但是僅僅是理論基礎,在實際上大多人都是使用TCP/IP的分層結構
首先,我們先得知道,為什么我們要在計算機網絡中分層次???
因為如果兩臺計算機能夠相互通信的話,實際實現起來是非常困難操作的…我們分層的目的就是為了將困難的問題簡單化,并且如果我們分層了,我們在使用的時候就可以僅僅關注我們需要關注的層次,而不用理會其他層。
如果需要改動設計的時候,我們只需要把變動的層替換即可,并不用涉及到其他的層次。這與我們程序設計中的低耦合是一個概念。
而我們的HTTP協議是在最上層,也就是應用層。這是最貼近我們的程序員的層次。
網站通信粗略過程
我們知道HTTP是在應用層中的,顯然,我們在Web通信的過程中,不僅僅是需要HTTP協議的,還會涉及到其他的協議的。
DNS:負責解析域名
HTTP:產生請求報文數據
這里寫圖片描述
TCP協議:分割HTTP數據,保證數據運輸
IP協議:傳輸數據包,找到通信目的地地址。
接下來就離我們比較遠了,屬于硬件相關的了,也就是鏈路層和物理層。以后復習到計算機網絡的時候再來補充吧!
我們網頁上請求數據就是上邊這么一個流程。
我們如果開發過Web程序的話,我們知道常用的提交方式有POST和GET方法
我們也知道GET是用來獲取數據的,POST是用來提交數據的。
其實HTTP協議中還支持著其他的方法,比如:Input、Delete、OPTIONS很多這樣的方法。而由于常用,于是我們也可能僅僅知道GET和POST方法了。
HTTP提供方法的目的就是為了告知服務器該客戶端想進行什么操作。當HTTP是OPTIONS方法的時候,服務器端就會返回它支持什么HTTP方法。
當然了,現在RESTful盛行,也就是充分利用了HTTP協議的這些方法。
HTTP是無狀態的,也就是說,它是不對通信狀態進行保存的。它并不知道之前通信的對方是誰。這樣設計的目的就是為了讓HTTP簡單化,能夠快速處理大量的事務!
但是,我們經常是需要知道訪問的人是誰,于是就有了Cookie技術了。
在HTTP1.0的時候,每一次進行HTTP通信就會斷開一次連接。如果容量很少的文本傳輸是沒有問題的。但是如果我們訪問一個網頁,該網頁有非常多的圖片。一個圖片就算上一個HTTP請求了。那么在中途中就不斷地建立TCP連接、獲取圖片、斷開TCP連接。
這樣是非常浪費資源的,因此在HTTP1.1版本,就是持久連接了。一次HTTP連接能夠處理多個請求。
持久連接為“管線化”方式發送成為了可能:在一次HTTP連接里面,不需要等待服務器響應請求,就能夠繼續發送第二次請求。
在說明之前,首先我們要知道什么是實體主體
一般地,實體主體可以等價為報文主體,報文主體是HTTP中的一部分。
我們如果不使用任何手段,服務器返回的數據實體主體是原樣返回的。我們可以使用兩種方式來提高傳輸效率
我們如果在下載東西的過程中斷了,按照以前我們是需要重新下載的,但是現在可以在中斷中繼續下載。我們可以使用到獲取范圍數據,這種叫做范圍請求!
這種請求只會下載資源的一部分。
2XX
一般是請求成功
200 正常處理
204 成功處理,但服務器沒有新數據返回,顯示頁面不更新
206 對服務器進行范圍請求,只返回一部分數據
3XX
一般表示重定向
301 請求的資源已分配了新的URI中,URL地址改變了?!居谰弥囟ㄏ颉?/p>
302 請求的資源臨時分配了新的URI中,URL地址沒變【轉發】
303 與302相同的功能,但明確客戶端應該采用GET方式來獲取資源
304 發送了附帶請求,但不符合條件【返回未過期的緩存數據】
307 與302相同,但不會把POST請求變成GET
4XX
表示客戶端出錯了。
400 請求報文語法錯誤了
401 需要認證身份
403 沒有權限訪問
404 服務器沒有這個資源
5XX
服務器出錯了
500 內部資源出錯了
503 服務器正忙
首先要說的是,一個HTTP服務器可以擁有多個站點,也就是說:HTTP下可以配置多個虛擬主機。當用戶訪問不同主機的時候,實際上都是訪問同一臺HTTP服務器。
在客戶端和服務器中還有一些用于通信數據轉發的應用程序:
HTTP請求報文
HTTP請求報文:在請求中,HTTP報文由方法、URI、HTTP版本、HTTP首部字段等部分組成。
首部字段例子:
HTTP響應報文
HTTP響應報文:在響應中,HTTP報文由HTTP版本、狀態碼(數字和原因短語)、HTTP首部字段3部分組成。
狀態行:
首部字段例子:
對于HTTP首部這一部分是非常龐大的一個章節,知識點也很多,我就沒有一一去記錄了。用到的時候再查吧。我看的是《圖解HTTP》。
HTTP在安全上是不足的
我們一般在上網時,使用抓包工具就很容易獲取到HTTP請求的信息了,這是TCP/IP在網絡通信中無法避免的。
假設我們對HTTP報文進行加密了, 那也僅僅是是內容的加密。別人獲取到了HTTP內容了,即使無法破解HTTP內容,還是能夠篡改的。
我們最好就是使用SSL建立安全的通信線路,就可以在這條線路上進行HTTP通信了。
其實HTTPS就是披著SSL的HTTP…
HTTPS使用的是共享密鑰和公開私有密鑰混合來進行加密的。由于公開私有密鑰需要太多的資源,不可能一直以公開私有密鑰進行通信。因此,HTTP在建立通信線路的時候使用公開私有密鑰,當建立完連接后,隨后就使用共享密鑰進行加密和解密了
對于認證方面,HTTPS是基于第三方的認證機構來獲取認受認可的證書、因此,可以從中認證該服務器是否是合法的。
而客戶端方面則需要自己購買認證證書、這實施起來難度是很大的【認證證書需要錢】。
所以,一般的網站都是使用表單認證就算了,這是用得最廣泛的客戶端認證了。
Java識堂,一個高原創,高收藏,有干貨的微信公眾號,一起成長,一起進步,歡迎關注
習Python也有一段時間了,在學習過程中不斷的練習學到的各類知識,做的最多的還是爬蟲,也就是簡單的數據采集,有采集圖片(這個最多了。。。),有下載電影的,也有學習相關的比如ppt模板的抓取,當然也寫過類似收發郵件,自動登錄論壇發帖,驗證碼相關操作等等!
這些腳本有一個共性,都是和web相關的,總要用到獲取鏈接的一些方法,在此總結一下,也共享給正在學習的小伙伴
python的各個版本其實分別并不大,所以不用太糾結用3.6還是3.7.
而我們經常使用的庫呢,建議大家學到什么庫安裝什么庫
有的同學會糾結,庫安裝不上的問題,這個推薦大家百度搜索:python whl 第一個就是吧,在里面有各個庫的各個版本,選擇對應的下載回來,用pip install 文件完整路徑 安裝即可!
import requests#導入庫
html = requests.get(url)#獲取源代碼
適用于靜態網頁
大部分的網站(各類中小型網站)都會需要你的代碼有headers的信息,如果沒有,會直接拒絕你的訪問!大型網站反而很少,尤其是門戶網站,比如新浪新聞、頭條圖集、百度圖片的爬蟲,基本沒有什么反爬措施,相關內容可以看看我的其他文章!
而有反爬措施的網站,大部分可以按加入UA信息——加入HOST、Referer(反盜鏈)信息的順序加入到headers數據(字典格式)中來嘗試!代碼格式 requeststs.get(url,headers=headers)
UA信息是瀏覽器信息,告訴對方服務器我們是什么瀏覽器,平時可以收集下相關信息做個UA池,需要的時候調用就可以,也可以隨機調用,防止被網站發現,注意的是如果是移動端,一定要注意移動端的網頁和pc端的不一樣,比如做微博爬蟲,我們就比較喜歡移動端,它的反爬力度比pc端的要低很多,也提醒大家,如果一個網站反爬很厲害,你可以去看看移動端(手機登錄然后復制url),也許會有驚喜!
ua信息
HOST信息, 網站的主機信息,這個一般是不變的
Referer信息 ,這個就是“反盜鏈”的關鍵信息,簡單的說,就是你是從哪里到當前頁面的,破解也很簡單,把url放到里面就行!
如果上述辦法還是繞不過反爬,那么就麻煩一些,把headers里面的信息都寫進去吧
終極反“反爬”:去學習selenium吧少年!
其實可以簡單的分兩大類:字符串內容保存和其他內容保存!那么簡單的2中代碼就可以解決
a+為文末追加寫入模式,適用于字符串內容的寫入,注意排版,也可以在'a+'后面添加參數encoding='utf-8'指定保存文本的編碼格式
wb為二進制寫入模式,適用于找到對象的真實下載地址后用二進制方式下載文件
篇幅有限,本來想寫完的,但是有人和我說,寫的太多沒人看。。。這就很尷尬了!那就先寫到這里吧!
也正好有時間重新整理下后面的內容,大概有:自動登錄(cookie池)和保持登錄、ip代理、驗證碼(這個是大項)以及scarpy框架的一些注意事項。
有其他技巧或者疑問的同學,也可以在評論區寫上,咱們一起討論哦!
*請認真填寫需求信息,我們會在24小時內與您取得聯系。