PHP介面HTTP安全認證之Basic模式

weixin_33797791發表於2018-11-19

0x00 前言

隨著專案需求的逐漸增多,功能的逐漸繁雜。以介面(API)形式獲取資料成了不可避免的途徑。那麼如何提高PHP介面的安全性呢?下面是途徑之一,廢話不多說,直接上碼。

0x01 PHP服務端驗證方法:

<?php
define('ADMIN_USERNAME', 'admin');  // Admin Username
define('ADMIN_PASSWORD', md5('111111')); // Admin Password

//Authenticate
if (!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW'])
    || $_SERVER['PHP_AUTH_USER'] != base64_encode(ADMIN_USERNAME)
    || $_SERVER['PHP_AUTH_PW'] != base64_encode(ADMIN_PASSWORD)) {

    header('WWW-Authenticate: Basic realm="Auth failed"');
    Header("HTTP/1.0 401 Unauthorized");

    echo <<<EOB
        <html><body>
        <h1>Rejected!</h1>
        <big>Wrong Username or Password!</big>
        </body></html>
EOB;
}
else {
    echo "通過驗證!";
}

0x02 PHP客戶端請求方法:

define('ADMIN_USERNAME', 'admin');  // Admin Username
define('ADMIN_PASSWORD', md5('111111')); // Admin Password
$url = 'http://127.0.0.1/phpinput/output.php';  // url 必要引數
$params = ['name'=>'wangbiao', 'age'=>30];      // 引數 非必要

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0); // 可自定義Header
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, base64_encode(ADMIN_USERNAME) . ':' . base64_encode(ADMIN_PASSWORD));
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);  // 傳遞引數
$data = curl_exec($ch);

print_r($data);

0x03 總結

Basic Access Authentication scheme是在HTTP1.0提出的認證方法,它是一種基於challenge/response的認證模式,針對特定的realm需要提供使用者名稱和密碼認證後才可訪問,其中密碼使用明文傳輸。Basic模式認證過程如下:

1 瀏覽器傳送http報文請求一個受保護的資源。
2 服務端的web容器將http響應報文的響應碼設為401,響應頭部加入WWW-Authenticate: Basic realm=”myTomcat”。
3瀏覽器彈出對話方塊讓使用者輸入使用者名稱和密碼,並用Base64進行編碼,實際是使用者名稱+冒號+密碼進行Base64編碼,即Base64(username:password),這次瀏覽器就會在HTTP報文頭部加入Authorization: Basic bXl0b21jYXQ=。
4 服務端web容器獲取HTTP報文頭部相關認證資訊,匹配此使用者名稱與密碼是否正確,是否有相應資源的許可權,如果認證成功則返回相關資源,否則再執行 過程2,重新進行認證。
5 以後每次訪問都要帶上認證頭部。

服務端返回的認證報文中包含了realm=”Auth failed”,realm的值用於定義保護的區域,在服務端可以通過realm將不同的資源分成不同的域,域的名稱即為realm的值,每個域可能會有自己的許可權鑑別方案。

Basic認證模式有兩個明顯的缺點:

  • 無狀態導致每次通訊都要帶上認證資訊,即使是已經認證過的資源;
  • 傳輸安全性不足,認證資訊用Base64編碼,基本就是明文傳輸,很容易對報文擷取並盜用認證資訊。

相關文章