使用SecureLink模組
這個模組用於為所需的安全性“令牌”計算和檢查請求URL。在0.7.18版本以上的Nginx中提供了該模組,這個模組在Nginx的預設安裝中沒有包含在內,因此,如果想使用該模組那麼需要在configure時指定--with-http_secure_link_module選項。對於0.8.50之後的版,有新增了secure_link_md5指令和secure_link_expires變數,因此,指令secure_link_secret已經不贊成使用了。
配置示例
示例1、
location /prefix/ { secure_link_secret secret_word;
# If the hash is incorrect then $secure_link has the value of the null string. if ($secure_link = "") { return 403; }
# This needs to be here otherwise you'll get a 404. rewrite ^ /prefix/$secure_link break; } |
示例2、
location /p/ { ## This must match the URI part related to the MD5 hash and expiration time. secure_link $arg_st,$arg_e; # this must match the URI part related
## This is how the MD5 hash is built from a secret token, an URI and an ## expiration time. secure_link_md5 segredo$uri$arg_e; # 'segredo' is the secret token
## If the hash is incorrect then $secure_link is a null string. if ($secure_link = "") { return 403; }
## The current local time is greater than the specified expiration time. if ($secure_link = "0") { return 403; }
## If everything is ok $secure_link is 1. ## This needs to be here otherwise you'll get a 404. rewrite ^/p/(.*)$ /p/$1 break; } |
在這個配置中,我們最終會通過以下URL訪問:
http://example.com/p/files/top_secret.pdf?st=PIrEk4JX5gJPTGmvqJG41g&e=1324527723 |
在這個URL中有兩處看的比較不順眼:
一處是st=PIrEk4JX5gJPTGmvqJG41g,另一處是e=1324527723,這兩個引數會被傳遞到伺服器端,然後會通過相應的引數獲取這些值,至於這些值的使用後面會講到,我們現在主要說這些值是怎麼來的,下面的值都是通過在命令列中計算出的,但是在具體的應用中都是通過具體的語言自動計算得出。
要構建上面的雜湊值,可以使用PHP語言(當然其它語言也是可以的),例如我在命令列中使用PHP生成雜湊值:
[root@mail gz]# php -r 'print str_replace("=", "",strtr(base64_encode(md5("segredo/p/files/top_secret.pdf1324527723", TRUE)), "+/", "-_")) . "\n";' PIrEk4JX5gJPTGmvqJG41g |
如上所示,用黑體字打出的這一行便是MD5雜湊值。當然如果你執行著web 應用,那麼這個值必須是自動生成的,而不能像這樣手動命令列操作,需要注意的是MD5雜湊格式為二進位制格式,因此要進行base64編碼。
對於生存期,我們可以是PHP的time()函式來實現,當然也可使用其它語言來實現,為了獲取Unix epoch時間格式。在這裡我們可以通過linux命令計算出:
[root@mail gz]# date +%s -d "December 22, 2011 12:22:03" 1324527723 |
也許你會問這個 "December 22, 2011 12:22:03" 時間是怎麼推出來的,同樣是使用date:
[root@mail gz]# date -d @1324527723 Thu Dec 22 12:22:03 CST 2011 |
指 令
該模組提供了以下3條指令。
指令名稱:secure_link_secret
語 法: secure_link_secret secret_word
默 認 值: none
使用環境: location
功 能:該指令用於指定一個密碼,該密碼被用於MD5雜湊生成校驗請求。一個完整的被保護的連線格式如下:
/prefix/MD5 hash/reference
這裡的MD5雜湊值就是由該指令指定的secret_word密碼生成,然後利用它來保護安全連線URI
例如,我們想保護位於目錄p下的檔案top_secret_file.pdf,那麼我們需要在Nginx的配置檔案中新增以下配置:
location /p/ { secure_link_secret segredo;
# If the hash is incorrect then $secure_link has the value of the null string. if ($secure_link = "") { return 403; }
# This needs to be here otherwise you'll get a 404. rewrite ^ /p/$secure_link break; } |
我們可以通過使用openssl目錄行工具來計算MD5雜湊值,具體的做法是這樣的:
[root@mail gz]# echo -n 'top_secret_file.pdfsegredo' | openssl dgst -md5 0849e9c72988f118896724a0502b92a8 |
我們看到,被MD5計算的字元不僅僅是指令secure_link_secret指定的segredo密碼,還有被訪問檔案的檔名稱。
在計算出這個值後,我們現在才可以使用以下的URL進行訪問(這已經是一個被保護的URL):
http://example.com/p/0849e9c72988f118896724a0502b92a8/top_secret_file.pdf
而採用通常的方法:
http://example.com/p/top_secret_file.pdf
是無法訪問到檔案。
需要注意的問題有一點,那就是不要出現以下的使用方法:
location / { # This is wrong, wrong, wrong. It's a root path! secure_link_secret segredo; [...] } |
這配置之所以錯,就是因為它對根路徑實施了保護,這是不可以的,因此,僅能對非根的的路徑進行安全連線保護。
指令名稱:secure_link
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/27043155/viewspace-732983/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- pymysql模組的使用MySql
- wtforms模組的使用ORM
- 使用typescript開發angular模組(編寫模組)TypeScriptAngular
- Flask:sqlalchemy模組的使用FlaskSQL
- glom模組的使用(一)
- glom模組的使用(二)
- OpenCV中GPU模組使用OpenCVGPU
- Drupal 模組使用心得
- git 子模組使用小結Git
- 使用Leaflet建立地圖模組地圖
- Paramiko模組簡單使用
- BeautifulSoup模組的使用方法
- 如何使用`open-uri`模組
- Python中模組的使用Python
- 使用 Router 思想劃分模組
- 【OpenCV】OpenCV中GPU模組使用OpenCVGPU
- 使用CPAN安裝Perl模組
- Tengine 常用模組使用介紹
- git 子模組使用方法Git
- nginx使用熱部署新增新模組Nginx熱部署
- Nginx使用SSL模組配置httpsNginxHTTP
- Go 模組--開始使用 Go ModulesGo
- 使用 Go 模組建立專案(vgo)Go
- Day24:IO模組的使用
- 十七 Django-使用者模組Django
- electron 使用 Node.js 原生模組Node.js
- Nginx使用Lua模組實現WAFNginx
- Python 中argparse模組的使用Python
- 爬蟲-urllib模組的使用爬蟲
- 超聲波測距模組使用
- odoo的Aeroo Reports模組使用。Odoo
- python random隨機模組使用Pythonrandom隨機
- Paramiko模組安裝與使用
- python—time模組使用詳解Python
- python—random模組使用詳解Pythonrandom
- ruby_expect模組的使用..薦
- 為什麼要使用模組模式?模式
- 【Python】通過xlwt模組使用表格Python