Xác thực HTTP với PHP

0
2

Có thể sử dụng chức năng header() để gửi thông báo “Yêu cầu xác thực” đến trình duyệt máy khách khiến nó bật lên cửa sổ nhập tên người dùng / mật khẩu. Khi người dùng đã điền tên người dùng và mật khẩu, URL chứa tập lệnh PHP sẽ được gọi lại với các biến được xác định trước PHP_AUTH_USER , PHP_AUTH_PW và AUTH_TYPE được đặt thành tên người dùng, mật khẩu và loại xác thực tương ứng. Các biến được xác định trước này được tìm thấy trong mảng $ _SERVER . Cả hai phương thức xác thực “Cơ bản” và “Tiêu hóa” (kể từ PHP 5.1.0) đều được hỗ trợ. Xem hàm header () để biết thêm thông tin.

Một đoạn mã ví dụ sẽ buộc xác thực ứng dụng khách trên một trang như sau:

Ví dụ # 1 Ví dụ xác thực HTTP cơ bản

<?php
if (!isset( $_SERVER [ 'PHP_AUTH_USER' ])) {
header ( 'WWW-Authenticate: Basic realm="My Realm"' );
header ( 'HTTP/1.0 401 Unauthorized' );
echo 'Text to send if user hits Cancel button' ;
exit;
} else {
echo "<p>Hello { $_SERVER [ 'PHP_AUTH_USER' ]} .</p>" ;
echo "<p>You entered { $_SERVER [ 'PHP_AUTH_PW' ]} as your password.</p>" ;
}
?>

Ví dụ # 2 Ví dụ xác thực HTTP

<?php
$realm = 'Restricted area' ;
//user => password
$users = array( 'admin' => 'mypass' , 'guest' => 'guest' );
if (empty( $_SERVER [ 'PHP_AUTH_DIGEST' ])) {
header ( 'HTTP/1.1 401 Unauthorized' );
header ( 'WWW-Authenticate: Digest realm="' . $realm .
'",qop="auth",nonce="' . uniqid (). '",opaque="' . md5 ( $realm ). '"' );
die( 'Text to send if user hits Cancel button' );
}
// analyze the PHP_AUTH_DIGEST variable
if (!( $data = http_digest_parse ( $_SERVER [ 'PHP_AUTH_DIGEST' ])) ||
!isset( $users [ $data [ 'username' ]]))
die( 'Wrong Credentials!' );
// generate the valid response
$A1 = md5 ( $data [ 'username' ] . ':' . $realm . ':' . $users [ $data [ 'username' ]]);
$A2 = md5 ( $_SERVER [ 'REQUEST_METHOD' ]. ':' . $data [ 'uri' ]);
$valid_response = md5 ( $A1 . ':' . $data [ 'nonce' ]. ':' . $data [ 'nc' ]. ':' . $data [ 'cnonce' ]. ':' . $data [ 'qop' ]. ':' . $A2 );
if ( $data [ 'response' ] != $valid_response )
die( 'Wrong Credentials!' );
// ok, valid username & password
echo 'You are logged in as: ' . $data [ 'username' ];
// function to parse the http auth header
function http_digest_parse ( $txt )
{
// protect against missing data
$needed_parts = array( 'nonce' => 1 , 'nc' => 1 , 'cnonce' => 1 , 'qop' => 1 , 'username' => 1 , 'uri' => 1 , 'response' => 1 );
$data = array();
$keys = implode ( '|' , array_keys ( $needed_parts ));
preg_match_all ( '@(' . $keys . ')=(?:([\'"])([^\2]+?)\2|([^\s,]+))@' , $txt , $matches , PREG_SET_ORDER );
foreach ( $matches as $m ) {
$data [ $m [ 1 ]] = $m [ 3 ] ? $m [ 3 ] : $m [ 4 ];
unset( $needed_parts [ $m [ 1 ]]);
}
return $needed_parts ? false : $data ;
}
?>

Lưu ý : Lưu ý tương thích

Hãy cẩn thận khi mã hóa các dòng tiêu đề HTTP. Để đảm bảo khả năng tương thích tối đa với tất cả các máy khách, từ khóa “Cơ bản” phải được viết bằng chữ “B”, chuỗi cảnh giới phải được đặt trong dấu ngoặc kép (không phải đơn) và chính xác một khoảng trắng phải đặt trước mã 401 trong Dòng tiêu đề HTTP / 1.0 401 . Các tham số xác thực phải được phân tách bằng dấu phẩy như đã thấy trong ví dụ tóm tắt ở trên.

Thay vì chỉ in ra PHP_AUTH_USER và PHP_AUTH_PW , như được thực hiện trong ví dụ trên, bạn có thể muốn kiểm tra tính hợp lệ của tên người dùng và mật khẩu. Có lẽ bằng cách gửi một truy vấn đến cơ sở dữ liệu hoặc bằng cách tra cứu người dùng trong tệp dbm.

Xem ra cho các trình duyệt Internet Explorer có lỗi. Họ có vẻ rất kén chọn về thứ tự của các tiêu đề. Gửi tiêu đề WWW-xác thực trước khi tiêu đề HTTP / 1.0 401 dường như thực hiện thủ thuật cho đến bây giờ.

Để ngăn người khác viết tập lệnh tiết lộ mật khẩu cho một trang được xác thực thông qua cơ chế bên ngoài truyền thống, các biến PHP_AUTH sẽ không được đặt nếu bật xác thực bên ngoài cho trang cụ thể đó và chế độ an toàn được bật. Bất kể, REMOTE_USER có thể được sử dụng để xác định người dùng được xác thực bên ngoài. Vì vậy, bạn có thể sử dụng $ _SERVER [‘REMOTE_USER’] .

Lưu ý : Lưu ý cấu hình

PHP sử dụng sự hiện diện của một lệnh AuthType để xác định xem xác thực bên ngoài có hiệu lực hay không.

Tuy nhiên, lưu ý rằng những điều trên không ngăn ai đó kiểm soát URL không được xác thực lấy cắp mật khẩu từ các URL được xác thực trên cùng một máy chủ.

Cả Netscape Navigator và Internet Explorer sẽ xóa bộ nhớ cache xác thực của cửa sổ trình duyệt cục bộ khi nhận được phản hồi của máy chủ là 401. Điều này có thể “đăng xuất” một người dùng một cách hiệu quả, buộc họ phải nhập lại tên người dùng và mật khẩu của họ. Một số người sử dụng thông tin này để “hết thời gian” đăng nhập hoặc cung cấp nút “đăng xuất”.

Ví dụ # 3 Ví dụ xác thực HTTP buộc một tên / mật khẩu mới

<?php
function authenticate () {
header ( 'WWW-Authenticate: Basic realm="Test Authentication System"' );
header ( 'HTTP/1.0 401 Unauthorized' );
echo "You must enter a valid login ID and password to access this resource\n" ;
exit;
}
if (!isset( $_SERVER [ 'PHP_AUTH_USER' ]) ||
( $_POST [ 'SeenBefore' ] == 1 && $_POST [ 'OldAuth' ] == $_SERVER [ 'PHP_AUTH_USER' ])) {
authenticate ();
} else {
echo "<p>Welcome: " . htmlspecialchars ( $_SERVER [ 'PHP_AUTH_USER' ]) . "<br />" ;
echo "Old: " . htmlspecialchars ( $_REQUEST [ 'OldAuth' ]);
echo "<form action='' method='post'>\n" ;
echo "<input type='hidden' name='SeenBefore' value='1' />\n" ;
echo "<input type='hidden' name='OldAuth' value=\"" . htmlspecialchars ( $_SERVER [ 'PHP_AUTH_USER' ]) . "\" />\n" ;
echo "<input type='submit' value='Re Authenticate' />\n" ;
echo "</form></p>\n" ;
}
?>

Hành vi này không được yêu cầu bởi tiêu chuẩn xác thực HTTP Basic , vì vậy bạn không bao giờ nên phụ thuộc vào điều này. Thử nghiệm với Lynx đã chỉ ra rằng Lynx không xóa thông tin xác thực bằng phản hồi của máy chủ 401, do đó, nhấn lại và sau đó chuyển tiếp sẽ mở tài nguyên miễn là các yêu cầu thông tin xác thực không thay đổi. Tuy nhiên, người dùng có thể nhấn phím ‘_’ để xóa thông tin xác thực của họ.

Để làm cho Xác thực HTTP hoạt động bằng máy chủ IIS với phiên bản CGI của PHP, bạn phải chỉnh sửa cấu hình IIS ” Thư mục bảo mật “. Nhấp vào ” Chỉnh sửa ” và chỉ kiểm tra ” Truy cập ẩn danh “, tất cả các trường khác sẽ không được chọn. Để chuyên sâu hơn, bạn có thể tìm hiểu khóa học PHP Fullstack để trau dồi kiến thức

Xem thêm: PHP có thể làm gì?

LEAVE A REPLY

Please enter your comment!
Please enter your name here