Php là một công cụ đơn giản có tính năng xác thực. HTTP Cài đặt bảo vệ trên một trang bằng MySQL và PHP. Ứng dụng. Nguồn tập lệnh

Việc hạn chế quyền truy cập vào bất kỳ khu vực nào của trang web thường trông giống như
đơn điệu: mỗi người dùng được cấp một thông tin đăng nhập và mật khẩu hoặc chính anh ta
chọn chúng và để vào phần bảo mật của trang web, chúng phải được nhập. Từ góc độ kỹ thuật, để kiểm tra mật khẩu họ sử dụng
các phương pháp khác nhau. Một biểu mẫu HTML có thể được sử dụng để nhập thông tin đăng nhập và mật khẩu của bạn.
Trong trường hợp này, mật khẩu được gửi đến máy chủ ở dạng văn bản rõ ràng trong yêu cầu POST.
Điều này là không thể chấp nhận được nếu người dùng là người địa phương, nếu có thể
sử dụng máy đánh hơi. Để giải quyết vấn đề này người ta đã phát minh ra một phương pháp
xác thực bằng cách sử dụng hàm băm, trong đó mật khẩu không được truyền đi nhưng
một chuỗi băm được truyền đi, tùy thuộc vào mật khẩu, một số lần
tham số và có thể từ một số tham số khác. Phương pháp này cũng
được gọi là thách thức/phản hồi, bởi vì khi sử dụng nó, khách hàng
nhận được yêu cầu với tham số một lần và gửi phản hồi chứa hàm băm. Ở cấp độ giao thức HTTP 1.1, xác thực bằng cách sử dụng
Cơ bản, không tốt hơn việc sử dụng biểu mẫu HTML và Digest,
chúng ta sẽ xem xét nó một cách chi tiết.

Khi sử dụng phương pháp Digest, như đã đề cập, mật khẩu
không được truyền đi và không thể bị đánh hơi, nhưng có một mặt khác
Các vấn đề. Để kiểm tra mật khẩu, máy chủ phải tính toán
phản hồi và so sánh nó với phản hồi của máy khách, do đó máy chủ phải
lưu trữ mật khẩu hoặc dữ liệu phụ thuộc vào nó cần thiết cho
chuyển xác thực. Theo đó, một người đã nhận được quyền
để đọc các tài khoản (ví dụ: sử dụng tính năng chèn SQL), sẽ có thể nhận được
truy cập vào các trang được bảo vệ bằng phương pháp Digest. Khi sử dụng phương pháp
Về cơ bản, có thể lưu trữ hàm băm thay vì mật khẩu, điều này không cho phép bạn nâng cao quyền,
sau khi đọc các giá trị băm này (bên dưới chúng ta sẽ thấy rằng Digest cũng có thể lưu trữ các giá trị băm,
nhưng sao cho kiến ​​thức của họ đủ để tính toán câu trả lời). Vì vậy, chúng ta phải đối mặt với một tình thế tiến thoái lưỡng nan: hoặc mật khẩu của chúng ta sẽ bị đánh cắp,
hoặc họ sẽ lấy nó thông qua một lỗ hổng web mà ai đó chắc chắn sẽ tìm thấy,
bởi vì bất cứ ai tìm kiếm sẽ luôn tìm thấy. Có một phương pháp xác thực mà không cần
Cả hai nhược điểm này đều là phương thức xác thực khóa chung:
để xác minh bạn cần có khóa chung và để vượt qua xác minh, bạn cần có khóa bí mật,
tuy nhiên, HTTP 1.1 không cung cấp phương thức như vậy. RFC 2069
khuyên bạn nên sử dụng SSL nếu bảo mật là rất quan trọng. Chỉ việc truyền mật khẩu được bảo vệ và nội dung không được mã hóa, vì vậy
rằng không có ích gì khi bảo vệ tài nguyên bằng phương pháp này, người dùng đến từ đâu
nhận được thông tin bí mật. Họ yêu cầu SSL. Và nó có ý nghĩa
bảo vệ, chẳng hạn như một diễn đàn hoặc tải nội dung lên một trang web. Vì vậy, nếu hosting không hỗ trợ SSL và phải xác thực
để an toàn, chúng tôi sẽ sử dụng Digest. Apache cung cấp mô-đun mod_digest. Để dùng nó
trong cấu hình (hoặc trong .htaccess), chúng tôi viết:

Thông báo loại xác thực
Tệp người dùng xác thực
Tên xác thực
Yêu cầu valid_user

File người dùng được tạo bởi tiện ích
htdigest. Đã có lúc có báo cáo về mod_digest rằng nó dễ bị tấn công, vì vậy
Có lẽ một số vấn đề khác sẽ xuất hiện ở đó. Hơn nữa, khi
Mình thử dùng ở nhà thì bị lỗi
Lỗi nội bộ máy chủ 500. Ngoài ra, nếu việc thêm tài khoản xảy ra
tự động, và sẽ có rất nhiều trong số đó, chúng nên
được lưu trữ không phải trong cấu hình Apache mà trong MySQL. Giải pháp -
sử dụng PHP. PHP không có hỗ trợ tích hợp cho việc này
phương pháp, vì vậy nó sẽ phải được thực hiện. Để làm được điều này bạn cần phải học
chi tiết về phương pháp này. Hãy để tôi lưu ý ngay rằng thông tin được đưa ra trong bài viết này
việc triển khai chỉ hoạt động trên Apache, vì có toàn quyền truy cập vào các tiêu đề
yêu cầu (hàm apache_request_headers) chỉ hoạt động trong Apache, nhưng trên
có thể không có sẵn trên các máy chủ khác. Chúng ta chỉ cần đọc
Tiêu đề ủy quyền.

Mô tả phương pháp

Mô tả đầy đủ về phương pháp có thể được đọc trong RFC 2069 và nếu
Nói tóm lại, phương pháp này hoạt động như thế này. Khi máy chủ nhận được yêu cầu liên quan đến khu vực được bảo vệ,
nó đưa ra lỗi 401 Yêu cầu ủy quyền và tiêu đề yêu cầu
xác thực kiểu này:

WWW-Xác thực: Khu vực tiêu hóa="khu vực an toàn", nonce="123456123456"

vương quốc là tên của khu vực được bảo vệ và nonce là sử dụng một lần
nghĩa. Ngoài ra còn có các tham số tùy chọn mà chúng ta sẽ thảo luận
chúng tôi sẽ không. Máy khách lặp lại yêu cầu, thêm tiêu đề như thế này:

Ủy quyền: Digest lĩnh vực = "khu vực an toàn", tên người dùng = "123", uri="/index.php", nonce="123456123456", phản hồi = "1234567890abcdef1234567890abcdef"

Tham số uri phải khớp với URI trong yêu cầu và phản hồi là
câu trả lời được tính như sau:

phản hồi = H(H(A1) + ://:0000000000(A2))
H - hàm băm, MD5 mặc định
A1 = thông tin đăng nhập + => ; lĩnh vực + :// ; + mật khẩu
A2 = phương thức yêu cầu + ://: + URI
Phương thức yêu cầu là GET, POST, v.v.

Như chúng ta có thể thấy, A1 không phụ thuộc vào yêu cầu hoặc thời gian
giá trị, do đó máy chủ không thể lưu trữ mật khẩu mà
H(A1). Đây chính xác là cách nó được triển khai trong mod_digest trong Apache.
Tuy nhiên, dữ liệu tương tự là đủ cho khách hàng. Kẻ tấn công sau khi nhận được
hàm băm này có thể tính toán câu trả lời bằng cách sử dụng các công thức trên và
tạo một yêu cầu HTTP, ví dụ: sử dụng chương trình
AccessDriver và công cụ HTTP của nó
Trình gỡ lỗi. Quá trình này sẽ được hiển thị chi tiết hơn dưới đây. Máy chủ nên kiểm tra xem giá trị có phải là nonce không
cái đã được cấp trước đó cho khách hàng và liệu nó có lỗi thời hay không.
Nếu phản hồi khớp với tham số nonce, nhưng giá trị của tham số đó
không liên quan, phản hồi được mô tả ở trên với mã 401 chỉ được đưa ra vì
sự khác biệt là tham số được thêm vào tiêu đề WWW-Authenticate
stale=true, chỉ ra rằng quyền truy cập bị từ chối chỉ vì lý do này,
và nên thử lại mà không nhắc người dùng nhập mật khẩu mới. IMHO, điều này thật bất tiện, vì nếu xảy ra tình huống như vậy
khi thực hiện yêu cầu POST hoặc PUT với khối dữ liệu lớn, máy khách sẽ phải
truyền tất cả dữ liệu hai lần. Để tránh điều này, tiêu chuẩn cung cấp
Tiêu đề Thông tin xác thực, trong đó máy chủ có thể phản hồi
yêu cầu thành công để thông báo cho khách hàng vào lần tiếp theo.
Cú pháp giống như WWW-Authenticate, ngoại trừ nonce
được thay thế bằng nextnonce. Tuy nhiên, xét theo kết quả của tôi
thử nghiệm, Opera bỏ qua tiêu đề này. Một giải pháp khác: theo
RFC 2068 (HTTP/1.1), máy chủ có thể phản hồi trước khi yêu cầu hoàn tất,
để máy khách làm gián đoạn việc truyền dữ liệu không cần thiết, nhưng trong Apache+PHP, điều này
không được triển khai vì tập lệnh chỉ bắt đầu thực thi sau
cách Apache sẽ nhận và phân tích đầy đủ yêu cầu.

Lưu trữ dữ liệu giữa các yêu cầu

Có một điểm tinh tế trong việc triển khai phương pháp thử thách/phản hồi trong PHP.
Tham số một lần được tạo và cấp cho khách hàng trong một phản hồi và
được kiểm tra trong phiên khác của tập lệnh.
Nghĩa là, nó phải được lưu từ lệnh gọi tập lệnh này sang lệnh gọi tập lệnh khác và để làm được điều này, bạn sẽ phải
sử dụng tập tin hoặc cơ sở dữ liệu. Ví dụ của tôi sử dụng các tệp có tên
tương ứng với các giá trị một lần và bản thân các tệp chứa
Địa chỉ IP của khách hàng được cấp. Bộ sưu tập không được triển khai trong ví dụ
rác: bạn cần định kỳ xóa các tập tin cũ.

Phân tích mã

Tập lệnh này chỉ kiểm tra mật khẩu và hoạt động bất kể
đăng nhập Tùy thuộc vào sự thành công của việc kiểm tra, các câu trả lời đơn giản sẽ được đưa ra.