2012-12-28 35 views
5

Dưới đây là cách bố trí:PHP và .htaccess giải pháp xác thực

web root 
    - admin (dir) 
     - index.php 
     - js 
     - img 
     - other files/dirs 
    - dir 
    - files 

Cho đến bây giờ, tôi bảo vệ các thư mục admin với .htaccess passwd vì tôi muốn kiểm soát truy cập đầy đủ cho tất cả các file trong thư mục đó (bao gồm js kịch bản, jpg , pdf, v.v.) Mặt khác, CMS tùy chỉnh của tôi cung cấp xác thực bằng cách sử dụng PHP sesssion/cookie cho các URL khác. Những gì tôi muốn thực hiện là sử dụng cùng một xác thực PHP cho thư mục được bảo vệ .htaccess, tránh dấu nhắc popup cho người dùng/mật khẩu cho người dùng đã được xác thực PHP. Nói tóm lại:

  • Tôi muốn các dir admin để sử dụng các quy tắc .htaccess để xác thực
  • Nếu người dùng đã được xác nhận bằng PHP (đăng nhập trong một hình thức HTML, trên một tập tin không được bảo vệ), bỏ qua quá trình xác thực .htaccess thứ hai khi truy cập vào nội dung quản trị dir
  • Nếu một tổ chức phi PHP dùng xác thực cố gắng truy cập nội dung trong thư mục admin, HTTP auth sổ popup nên được kích hoạt

Hầu hết những thứ mà tôi đã đọc gợi ý di chuyển thư mục quản trị bên ngoài gốc web và truy cập t anh ta tập tin từ một kịch bản PHP với readfile, mà tôi không muốn làm. Có nội dung động trên thư mục đó, cũng như tĩnh. Tôi biết rằng apache sẽ kích hoạt popup auth trước khi tải bất kỳ tài nguyên để câu hỏi là làm thế nào để làm cho apache nhận thức rằng người dùng đã được xác thực. Bất kỳ đề xuất/giải pháp nào khác?

+1

Xác thực HTTP của bạn bằng php> http://php.net/manual/en/features.http-auth.php> http://koivi.com/archives/php-http-auth/ –

+2

Hãy xem ở đây, bạn có thể giải quyết bằng PHP chỉ: http://php.net/manual/en/features.http-auth.php và không có tệp .htaccess. Đối với Cookie Stuff, hãy xem tại đây: http://www.askapache.com/htaccess/htaccess-fresh.html#Get_Cookie_Value. Sau khi người dùng của bạn được đăng nhập vào một cookie được thiết lập. Tệp htaccess của bạn cần kiểm tra cookie đó. Điều này không hoạt động thực sự tốt với các phiên php, vì cookie phiên chỉ chứa một phiên băm. –

Trả lời

7

Bạn có thể sử dụng biến số SetEnvIf trong tệp .htaccess để kiểm tra xem có đặt giá trị Cookie nào đó không. Ví dụ (điều này không phải là rất an toàn, nhưng chỉ mang tính minh họa):

AuthType Basic 
AuthName "Protected Login" 
AuthUserFile "/path/to/.htpasswd" 
AuthGroupFile "/dev/null" 
SetEnvIf Cookie PHPSESSID=.* PASS=1 
Order deny,allow 
Deny from all 
Allow from env=PASS 
Require valid-user 
Satisfy any 

Dòng SetEnvIf Cookie PHPSESSID=.* PASS=1 kiểm tra xem một Cookie được thiết lập với một phiên id PHP và nếu như vậy, đó là đủ để Satisfy quá trình thẩm định và các Allow from env=PASS làm cho nó bỏ qua dấu nhắc đăng nhập nếu điều này là đúng sự thật.

Một lần nữa, ví dụ này không an toàn vì cookie phiên PHP đã được đặt khi session_start() được gọi mà không có nỗ lực xác thực thành công, vì vậy sẽ tốt hơn nếu đặt giá trị cookie khó hiểu hơn. Ví dụ:

SetEnvIf Cookie AJNC3Z921dmc4O8P2 PASS=1 

Bằng cách đó, nếu bạn đặt một giá trị cookie của AJNC3Z921dmc4O8P2 khi xác thực thành công thông qua PHP, đây sẽ là đủ để vượt qua quá trình xác thực. Hãy chắc chắn để thiết lập một thời gian hết hạn cookie đúng mặc dù để tránh những người có thể vượt qua dấu nhắc đăng nhập trong một thời gian dài.

+1

Hoạt động tuyệt vời, cảm ơn Oldskool! Không biết bây giờ làm thế nào an toàn toàn bộ điều cookie, nhưng tôi sẽ tăng gấp đôi kiểm tra anyway trong mỗi PHP script quyền thích hợp để truy cập nội dung động trên thư mục đó. Tôi khuyên bạn nên sử dụng đóng $ trên regexp, như sau: 'SetEnvIf Cookie AUTHCOOKIE = randomstring $ PASS 1', nếu không' randomstring1' sẽ khớp. – Stingus