1. 程式人生 > >使用PHP實現身份驗證的集中方法

使用PHP實現身份驗證的集中方法

1、簡單身份驗證

可以使用MySQL來改進原有的身份驗證機制,將使用者名稱和密碼(以SHA-1雜湊演算法1加密)資料儲存在MySQL資料庫中;
<?php
/* 提供簡單的身份驗證機制的PHP和HTML
* 可以將該指令碼的HTML部分獨立寫在一個HYML檔案上面,以方便用css和script對其進行再加工
*/
$name = $_POST['name'];
$password = $_POST['password'];

//當$name和$password沒有輸入完全時,顯示html表單重新鍵入值
if(!isset($name) || !isset($password)) {
?>
    <h1>Please Log In</h1>
    <p>This page is secret</p>
    <form method="post" action="secret.php">
        <p>UseraName:<input type="text" name="name" /></p>
        <p>Password:<input type="password" name="password" /></p>
        <p><input type="submit" name="submit" value="Log In" /></p>
    </form>

<?php
}else if(($name == "user") && ($password == "pass")) {
    echo "<h1>Here it is!</h1><p>I bey you are glad you can see this sercet page</p>";
}else{
    echo "<h1>Go Away!</h1><p>You are not authorized to use this source</p>";
}
?>

2、使用MySQL資料庫儲存使用者密碼資料,同時對密碼使用SHA-1演算法加密

<?php
$name = $_POST['name'];
$password = $_POST['password'];

if(!isset($name) || !isset($password)){
?>

    <h1>Please Log In</h1>
    <p>This page is secret</p>
    <form method="post" action="secretdb.php">
        <p>UseraName:<input type="text" name="name" /></p>
        <p>Password:<input type="password" name="password" /></p>
        <p><input type="submit" name="submit" value="Log In" /></p>
    </form>

<?php
}else{
    //連線mysql資料庫,並測試連線情況
    $mysql = mysqli_connect("localhost","webauth","webauth");
    if(!$mysql){
        echo "Cannot connect to database.";
        exit;
    }
    //尋找需要的資料庫auth
    $selected = mysqli_select_db($mysql,"auth");
    if(!$selected){
        echo "Cannot select database.";
        exit;
    }
    //對auth資料庫進行查詢操作,使用count()函式對查詢到的結果進行計數
    $query = "select count(*) from authorized_users
              where name = '".$name."' and password = sha1( '".$password."')  "; //使用sha1演算法對password進行加密;
    $result = mysqli_query($mysql,$query);
    if(!$result){
        echo "Cannot run away";
        exit;
    }
    $row = mysqli_fetch_row($result);   //將查詢結果包裝為一個數組
    $count = $row[0];

    if($count>0){
        echo "<h1>Here it is!</h1><p>I bey you are glad you can see this sercet page</p>";
    }else{
        echo "<h1>Go Away!</h1><p>You are not authorized to use this source</p>";
    }
}
?>

3、使用基本身份驗證

(1)HTTP的基本身份驗證:瀏覽器可以儲存使用者在站點輸入的身份驗證資訊,只要使用者重新開啟該站點視窗,它會自動將這些所需的資訊重新發送到Web伺服器而無需使用者介入; (2)HTT P1.1的摘要身份驗證:使用MD5演算法掩飾細節,但是對早期瀏覽器的支援性較差 (3)HTTP基本身份驗證的方法:PHP方法、Apache方法(《PHP和MySQL Web開發》p301); PHP方法
<?php
/*php觸發http基本身份驗證
 * */
//當使用IIS時候,要設定$_SERVER['PHP_AUTH_USER']和$_SERVER['PHP_AUTH_PW']

if((substr($_SERVER['SERVER_SOFTWARE'],0,9) == 'Microsoft') && (!isset($_SERVER['PHP_AUTH_USER']))
&& (!isset($_SERVER['PHP_AUTH_PW'])) && (substr($_SERVER['HTTP_AUTHORIZATION'],0,6)=='Basic')){
    list($_SERVER['PHP_AUTH_USER'],$_SERVER['PHP_AUTH_PW'])
        = explode(':',base64_decode(substr($_SERVER['HTTP_AUTHORIZATION'],6)));
}

if(($_SERVER['PHP_AUTH_USER'] != 'user') || ($_SERVER['PHP_AUTH_PW'] != 'pass')){
    header('WWW-Authenticate:Basic realm="Realm-Name"');

    if(substr($_SERVER['SERVER_SOFTWARE'],0,9) == 'Microsoft'){
        header('Status:401 Unauthorized');
    }else{
        header('HTTP/1.0 401 Unauthorized');
    }
    echo "<h1>Go Away!</h1><p>You are not authorized to use this source</p>";
}else{
    echo "<h1>Here it is!</h1><p>I bey you are glad you can see this sercet page</p>";
}
?>

4、建立供secretdb.php使用者身份驗證所使用的資料庫

# create database auth;
#使用資料庫
use auth;
#建立表(定義欄位名和格式)
create table authorized_users(name varchar(20),
                               password varchar(40),     #使用SHA-1加密後的字串一般是40位
                                primary key (name));    #設定主鍵name
#插入行資料

insert into authorized_users values('user1',sha1('pass1'));  #使用sha1函式對password欄位進行加密
insert into authorized_users values('user2',sha1('pass2'));

#對資料庫使用者進行授權
grant select on auth.*
              to 'webauth'
              identified by 'webauth';
flush privileges;     #更新許可權