sách gpt4 ăn đã đi

Cách triển khai xác thực HTTP trong PHP

In lại Tác giả: qq735679552 Thời gian cập nhật: 27-09-2022 22:32:09 25 4
mua khóa gpt4 giày nike

CFSDN nhấn mạnh vào giá trị tạo ra nguồn mở và chúng tôi cam kết xây dựng nền tảng chia sẻ tài nguyên để mọi nhân viên CNTT có thể tìm thấy thế giới tuyệt vời của bạn tại đây.

Bài viết trên blog CFSDN về cách PHP triển khai xác thực HTTP này được tác giả sưu tầm và biên soạn. Nếu bạn quan tâm đến bài viết này thì nhớ like nhé.

Trong quá trình phát triển hàng ngày, khi chúng tôi đăng nhập người dùng, trong hầu hết các trường hợp, chúng tôi sử dụng phiên để lưu thông tin đăng nhập của người dùng và sử dụng thông tin này làm cơ sở để xác định xem người dùng đã đăng nhập hay chưa. Nhưng trên thực tế, HTTP cũng cung cấp cơ chế xác minh đăng nhập này. Hôm nay chúng ta sẽ tìm hiểu về các kiến ​​thức liên quan đến xác minh HTTP.

HTTP cơ bản

?
1
2
3
4
5
6
7
8
9
10
11
12
nếu như (!isset( $_SERVER [ 'PHP_AUTH_USER' ])) {
     tiêu đề( 'WWW-Authenticate: Vùng cơ bản="Vùng của tôi"' );
     tiêu đề( 'HTTP/1.0 401 Không được phép' );
     tiếng vọng 'Văn bản gửi nếu người dùng nhấn nút Hủy' ;
     ra ;
} khác {
     tiếng vọng "

Xin chào {$_SERVER['PHP_AUTH_USER']}.

"
;
     tiếng vọng "

Bạn đã nhập {$_SERVER['PHP_AUTH_PW']} làm mật khẩu của mình.

"
;
}
// Quyền hạn: Cơ bản YWFhOmFhYQ==
tiếng vọng giải mã base64 ( 'YWFhOmFhYQ==' );
// aaa:aaa bằng văn bản thuần túy

Hãy bắt đầu trực tiếp với mã. Đoạn mã trên là phương thức xác thực HTTP đơn giản nhất. Nếu $_SERVER['PHP_AUTH_USER'] không tồn tại thì chúng tôi sẽ gửi tiêu đề phản hồi 401 tới trình duyệt, thông báo cho trình duyệt rằng chúng tôi cần đăng nhập. vào. xác minh. Khi trình duyệt nhận được tiêu đề phản hồi này, hộp xác minh đi kèm với trình duyệt sẽ bật lên và yêu cầu tên người dùng và mật khẩu.

Sau khi chúng ta điền tên người dùng và mật khẩu, trình duyệt sẽ đưa trường Ủy quyền trong tiêu đề yêu cầu và gửi tên người dùng và mật khẩu sau base64. Đồng thời, PHP sẽ phân tích tên người dùng và mật khẩu thành _SERVER['PHP_AUTH_USER'] và _SERVER['PHP_AUTH_PW'] tương ứng.

Phương thức xác thực ở trên là phương thức xác thực HTTP Basic đơn giản nhất. Có thể thấy rằng tên người dùng và mật khẩu được xác minh theo cách này thực sự tương đương với việc truyền văn bản rõ ràng, vì base64 có thể dễ dàng phân tích cú pháp ngược. Vì vậy phương pháp này rất không an toàn. Vậy có cách nào phức tạp hơn không?

Tóm tắt HTTP

Bây giờ đã viết như thế này thì phải có cách nào tốt hơn, đó là phương pháp xác thực HTTP Digest.

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
$vương quốc = 'Khu vực hạn chế' ;
 
//người dùng => mật khẩu
$người dùng = mảng ( 'quản trị viên' => 'mật khẩu của tôi' , 'khách mời' => 'khách mời' );
 
// Chỉ định phương thức xác minh Digest
nếu như ( trống ( $_SERVER [ 'PHP_AUTH_DIGEST' ]) || ! $_COOKIE [ 'đăng nhập' ]) {
     đặt cookie( 'đăng nhập' , 1);  // Phán quyết điều kiện đăng xuất
     tiêu đề( 'HTTP/1.1 401 Không được phép' );
     tiêu đề( 'WWW-Xác thực: Digest realm="' . $vương quốc .
         '",qop="xác thực",nonce="' . độc nhất() . '",mờ đục="' .md5( $vương quốc ) . "" );
    
     // Nếu người dùng click Cancel mà không nhập mật khẩu
     cái ( 'Bạn đã bấm Hủy và không thể đăng nhập' );
    
}
 
//Xác minh thông tin đăng nhập của người dùng
nếu như (!( $dữ liệu = http_digest_phân_pháp( $_SERVER [ 'PHP_AUTH_DIGEST' ])) ||
     !isset( $người dùng [ $dữ liệu [ 'tên người dùng' ]])) {
     cái ( 'Giấy tờ chứng nhận sai!' );
}
 
//Xác minh thông tin đăng nhập
$A1 = md5( $dữ liệu [ 'tên người dùng' ] . ':' . $vương quốc . ':' . $người dùng [ $dữ liệu [ 'tên người dùng' ]]);
$A2 = md5( $_SERVER [ 'PHƯƠNG_PHÁP_YÊU_CẦU' ] . ':' . $dữ liệu [ 'kiểu' ]);
$phản_ứng_hợp_lệ = md5( $A1 . ':' . $dữ liệu [ 'không có gì' ] . ':' . $dữ liệu [ 'nc' ] . ':' . $dữ liệu [ 'cnonce' ] . ':' . $dữ liệu [ 'cái túi' ] . ':' . $A2 );
// $data['response'] là nội dung được mã hóa của trình duyệt client
nếu như ( $dữ liệu [ 'phản ứng' ] != $phản_ứng_hợp_lệ ) {
     cái ( 'Giấy tờ chứng nhận sai!' );
}
 
// Xác minh tên người dùng và mật khẩu thành công
tiếng vọng 'Người dùng đăng nhập của bạn là:' . $dữ liệu [ 'tên người dùng' ];
đặt cookie( "đăng nhập" , 2);
 
// Ủy quyền: Digest username="guest", realm="Khu vực hạn chế", nonce="5e815bcbb4eba", uri="/", response="9286ea8d0fac79d3a95fff3e442d6d79", opaque="cdce8a5c95a1427d74df7acbf41c9ce0", qop=auth, nc=00000002, cnonce="a42e137359673851"
// Giá trị nonce trong tin nhắn trả lời của máy chủ, cộng với tên người dùng, mật khẩu, phương thức http, http uri sử dụng MD5 (hoặc các thuật toán khác do máy chủ chỉ định) để tính toán thông báo yêu cầu làm giá trị của trường tiêu đề trả lời
 
 
// Lấy thông tin đăng nhập
chức năng http_digest_phân_pháp( $txt )
{
     // tiếng vang $txt;
     // bảo vệ chống lại dữ liệu bị mất
     $cần_các_phần = mảng ( 'không có gì' => 1, 'nc' => 1, 'cnonce' => 1, 'cái túi' => 1, 'tên người dùng' => 1, 'kiểu' => 1, 'phản ứng' => 1);
     $dữ liệu = mảng ();
     $chìa khóa = nổ tung( '|' , mảng_khóa ( $cần_các_phần ));
 
     preg_match_tất_cả( '@(' . $chìa khóa . ')=(?:([\'"])([^\2]+?)\2|([^\s,]+))@' , $txt , $trận đấu , ĐẶT HÀNG TRƯỚC);
 
     foreach ( $trận đấu BẰNG triệu đô la ) {
         $dữ liệu [ triệu đô la [1]] = triệu đô la [3] ? triệu đô la [3] : triệu đô la [4];
         bỏ đặt( $cần_các_phần [ triệu đô la [1]]);
     }
 
     trở lại $cần_các_phần ? SAI : $dữ liệu ;
}
 
nếu như ( $_NHẬN [ 'đăng xuất' ]){
 
     đặt cookie( "đăng nhập" , 0);
     tiêu đề( "Vị trí: /" );
}

Bạn có thể thấy từ số lượng mã mà phương pháp này phức tạp hơn nhiều. Trước tiên, chúng tôi cũng cần trả về tiêu đề phản hồi 401 khi chưa đăng nhập, cho trình duyệt biết rằng chúng tôi muốn thực hiện xác thực Digest. Thông tin tiêu đề ở đây khác. Định dạng là Digest và nội dung nhiều hơn Basic. Những nội dung bổ sung này là những gì chúng ta cần sử dụng khi xác minh nội dung xác thực.

Sau đó, trình duyệt cũng sẽ hiện ra một cửa sổ pop-up để nhập tên người dùng và mật khẩu. Sau đó gửi thông tin tên người dùng và mật khẩu được mã hóa. Chúng ta có thể thấy rằng có một tên người dùng văn bản rõ ràng trong giá trị trả về, nhưng không có mật khẩu văn bản rõ ràng. Trên thực tế, mật khẩu được tạo bằng mã hóa md5 của tên người dùng, mật khẩu, nonce, nc, cnoce, cop, $_SERVER['REQUEST_METHOD'], uri và các nội dung khác và được gửi trong trường phản hồi. Chúng tôi cũng cần tuân theo các quy tắc tương tự để lấy mật khẩu được mã hóa để so sánh nhằm xác định rằng tên người dùng và mật khẩu là chính xác để người dùng có thể hoàn tất quy trình đăng nhập thông thường.

Trong mã này, chúng tôi đã thêm một cookie, được sử dụng để xác định xem có nên đăng xuất hay không. Bởi vì thời gian hết hạn của hình thức xác thực HTTP này dựa trên trình duyệt. Nghĩa là, nếu khách hàng đóng trình duyệt, tên người dùng và mật khẩu được lưu trong bộ nhớ trình duyệt của khách hàng sẽ biến mất. Trong trường hợp này, chúng tôi chỉ có thể sử dụng cookie để đăng xuất. Nếu người dùng đăng xuất, chúng tôi sẽ thay đổi nội dung của cookie này và gửi lại tiêu đề phản hồi 401 tới trình duyệt để yêu cầu đăng nhập lại.

Tóm tắt

Hoạt động xác thực HTTP thường không được sử dụng như một chức năng đăng nhập thông thường trong quá trình phát triển hàng ngày của chúng tôi. Trong hầu hết các trường hợp, chúng tôi sẽ thêm một lớp xác thực HTTP vào phần phụ trợ hoặc một số công cụ quản lý đặc biệt để đạt được xác thực kép. Điều này nhằm đảm bảo bảo mật dữ liệu. trong nền. Ví dụ: tôi sẽ thêm một lớp xác thực này vào phpMyAdmin của mình. Ngoài ra, xác thực HTTP cũng có thể được cấu hình trực tiếp trong Nginx hoặc Apache mà không cần đến cấp độ PHP. Chúng tôi sẽ giải thích điều này trong tương lai khi chúng tôi tìm hiểu Nginx.

Mã kiểm tra: github.com/zhangyue050… .

Trên đây là chi tiết về cách PHP triển khai xác thực HTTP. Để biết thêm thông tin về xác thực HTTP HTTP, vui lòng theo dõi các bài viết liên quan khác của tôi! .

Liên kết gốc: https://juejin.cn/post/6945257392342827022.

Cuối cùng, bài viết về cách PHP triển khai xác thực HTTP kết thúc ở đây. Nếu bạn muốn biết thêm về cách PHP triển khai xác thực HTTP, vui lòng tìm kiếm các bài viết về CFSDN hoặc tiếp tục duyệt các bài viết liên quan. Tôi hy vọng bạn sẽ ủng hộ blog của tôi trong tương lai! .

25 4 0
qq735679552
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress