2012年10月13日 星期六

如何讓一個 login 的網頁只能經由 https 來登入

問題蠻複雜的,好像需要瞭解的東西也不少,所以我們慢慢來建構這個網頁。
動機: 在開發網頁資訊系統的時候,我們經常需要讓使用者登入,而且我們希望使用者登入的帳號以及密碼不會在 Internet 傳遞的時候被竊聽或者竊取,這時我們就需要使用 https 來對資料進行加密。可是往往設計一個登入的網頁(例如:login.php),我們不但可以 http://xml.nchu.edu.tw/test/login.php,也可以 https://xml.nchu.edu.tw/test/login.php 來存取。為了確保使用者只能使用 https 來登入,我們需要把所有 http://xml.nchu.edu.tw/test/login.php 的連線都轉成 https://xml.nchu.edu.tw/test/login.php。


  1. 我們以 Apache2 為範例。你的 Apache2 需要支援 mod_ssl 以及 mod_rewrite,你可以利用 /usr/local/apache2/bin/httpd -l 來列印出你的 Apache2 是否支援 ssl 以及 rewrite 的 modules。如果沒有,你必須先完成安裝手續。
  2. 備份並修改你的 httpd.conf:請新增下列設定到你的 httpd.conf 內。
    01 #RewriteLog      /www/logs/rewrite.log
    02 #RewriteLogLevel 1
    03 
    04 <Directory "/www/htdocs/test">
    05    RewriteEngine   on
    06    Options +FollowSymLinks
    07    Order allow,deny
    08    Allow from all
    09    RewriteCond %{SERVER_PORT} !^443$
    10    RewriteRule ^login\.php$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R]
    11 </Directory>
    
    • 第 01 和 02 行的目的是為了使用 mod_rewrite 時的所有 log 的紀錄。如果你沒辦法將 http 的登入網頁自動變成 https,請你將這兩行最前面的 # 拿掉。注意,如果一切都 OK 的話,儘量不要使用 log,因為它會使得 Apache2 慢很多。
    • 第 04 和 11 行的目的是為了限定 /www/htdocs/test 這個目錄內的設定才有用。
    • 啟動 mod_rewrite 需要第 05、06、07、08 行。
    • 第 10 行用來指定當使用者要存取 login.php 這個網頁的時候,Apache2 會將這個連線轉成 https。
    • 第 09 行用來指定當使用者經由非 443 這個 port 來存取 login.php 這個網頁的時候,狀況為真。
    • 如果我們把第 10 行的 ^login\.php$ 改成 ^.*$ 則代表所有進入 test 這個目錄內的連結都會以 https 的方式完成。
  3. 重新啟動 httpd。

今天(12/29/2008)發現另一個方式,這個方式僅適用於 Wordpress 的環境。
  1. Wordpress 2.5 版以後,我們可以在 wp-config.php 中加入define('FORCE_SSL_ADMIN', true);的方式。
  2. 之後,使用 login.php,它會自動進入 https 的連線型態;而且依照我使用的情形來看,這個方式會比之前利用 Apache/mod_ssl/mod_rewrite 的方式來得穩定。
參考資料

沒有留言:

張貼留言