2010年5月23日 星期日

PHP實作安全機制(1)

使用PHP有幾種方法來保護安全:
這邊介紹用Http認證來防護
也會提到header()函式的用法

Http認證

Http認證的方式是透過伺服器與瀏覽器之間的header溝通來運作
header在每個瀏覽器請求或是伺服器回應裡頭傳送
這使得我們可以用它來中斷從伺服器到瀏覽器的頁面傳送
要求使用者輸入正確的帳號與密碼後才能繼續讀取頁面

實作程式碼如下:
auth.php===========

<?php
//user name and password for authentication
$username = 'admin';
$password = "pw";

if(!isset($_SERVER['PHP_AUTH_USER']) ||
   !isset($_SERVER['PHP_AUTH_PW']) ||
   $_SERVER['PHP_AUTH_USER'] != $username ||
   $_SERVER['PHP_AUTH_PW'] != $password
   ){
   //The user name/password are incorrect to send the authentication headers
   header('HTTP?1.1 401 Unauthorized');
   header('WWW-Authenticate:Basic realm = "test"');
   exit('<h2>Fail Login!!!</h2>');
   }else{
   header('Location:http://www.google.com');
   }
?>

這段程式碼要求使用者輸入帳密
如果帳密輸入錯誤,則會跳出Fail Login的字眼
成功則轉送到Google的頁面

程式碼裡用了兩個PHP超全域變數
$_SERVER['PHP_AUTH_USER'] 這個變數存放使用者輸入認證視窗的名稱
$_SERVER['PHP_AUTH_PW']則存入輸入認證視窗的密碼

header()函式控制伺服器傳送給瀏覽器的資訊
但是這個在使用上有一個限制,標頭必須在任何html內容之前被傳送
即使前面有個空白字元也不行

header('HTTP?1.1 401 Unauthorized')讓瀏覽器知道使用者尚未通過認證,無法觀看頁面
下一行的裡的WWW-Authenticate要求瀏覽器提示使用者輸入帳號密碼進行認證
Basic realm則是用來辨識這個特別認證的用語
它的值會出現在認證視窗中,一旦使用者正確輸入帳密,在同樣realm的面即可通行無阻

exit()當然就是提供了離開認證之後出現的畫面
這段程式碼設定了當前兩個header執行結束(認證失敗)時才會被執行到

header的使用上相當有彈性,不只是這例子裡面的認證。
header('Location:http://.....')能轉移網頁到別的頁面
header('Refresh: 5; url = http://......')這個則是重新整理header,每一段時間就重整一次
header('Content-Type:text/plain')這樣的header則可以控制伺服器遞送的資料形態

當然這段程式碼有需要的話能夠寫成單獨頁面,其他有需要使用的頁面用include方式引入即可

沒有留言:

張貼留言