2011-08-19 28 views
10

Tôi đang tìm cách sử dụng tập lệnh PHP để kiểm soát quyền truy cập vào tài nguyên trong Apache. Tôi muốn có quyền kiểm soát truy cập không phụ thuộc vào tài nguyên đích; tức là nó sẽ hoạt động cho html, các tệp, các tập lệnh khác và các chương trình cgi, giống như chỉ thị "Cho phép từ" hoặc "Từ chối" sẽ làm - ngoại trừ việc sử dụng logic tùy chỉnh.Cách sử dụng tập lệnh PHP để kiểm soát truy cập trong Apache

tôi đã xem xét một số cách để cố gắng quản lý này:

  1. Sử dụng một module apache như mod_auth_script (ok nhưng mô-đun này là cũ và tôi giả định không quy mô tốt)
  2. chỉ
  3. Sử dụng FastCGI FastCgiAccessChecker
  4. Tạo module apache của riêng tôi để gọi php và làm bất cứ điều gì tôi cần

trong số này # 2 nhìn hứa hẹn nhất, và cũng có thể cầm tay nhất cho sự phổ biến của FastCG TÔI. Vì vậy, tôi quản lý để trao đổi ra các mô-đun Linux Linux thông thường và nhận được php làm việc thông qua fastcgi thay thế. Đó là khó khăn hơn so với trên Windows nhưng đã nhận nó làm việc cuối cùng như một máy chủ bên ngoài, tức là sử dụng Apache chỉ

FastCGIExternalServer /var/www/html/thing -host 192.168.0.11:9000

và bắt đầu php daemon

php-cgi -q -b 192.168.0.11:9000 &

Vấn bước vào cố gắng tìm một cách để gọi một kịch bản PHP bằng cách sử dụng FastCgiAccessChecker.

Tôi đã thử nhiều cách khác nhau để thử truyền tên kịch bản mà tôi muốn chạy bằng cách thay đổi tên tệp trong chỉ thị FastCGIExternalServer và/hoặc FastCgiAccessChecker - không hoạt động. Tôi cũng đã cố gắng bắt đầu php-cgi với một specifier kịch bản, ví dụ:

php-cgi -q -b 192.168.0.11:9000 -f /var/www/html/thing/access.php &

Không có gì hoạt động. Tôi có thể nói apache nhận ra các chỉ thị của tôi, bởi vì khi tôi bao gồm FastCgiAccessChecker, sau đó truy cập trang php, thay đổi kiểu nội dung thành văn bản/plain và tôi mất ~ 8000 byte nội dung đầu tiên từ trang được phân phối nếu đó là tập lệnh (không ý tưởng tại sao). Nhưng nó không gọi kịch bản PHP mà tôi muốn chạy.

Theo như tôi có thể hình dung, điều đang xảy ra là FastCgiAccessChecker giả định rằng máy chủ fastcgi được chỉ định được biên dịch riêng để hoạt động như một bộ kiểm tra truy cập. Không có cách nào để nói với các máy chủ fastcgi (PHP trong trường hợp của tôi) những gì kịch bản để chạy để làm kiểm tra truy cập.

Tôi đã tìm kiếm trên web và theo như tôi có thể nói không ai từng cố gắng sử dụng tập lệnh PHP cho điều này trước đây hoặc không ai viết về nó.

Vì vậy, câu hỏi của tôi: tôi nên làm gì? tôi có thể thấy một vài khả năng:

1) Tôi đang thiếu cái gì, và có một số cách kỳ diệu để làm cho FastCgiAccessChecker làm những gì tôi muốn: chạy một kịch bản PHP để kiểm soát kiểm soát truy cập apache

2) Tôi viết máy chủ FastCGI của riêng tôi trong c và nhúng PHP, vì vậy tôi có thể chỉ định tập lệnh PHP mà tôi muốn chạy (tôi đã dành một vài phút để xem nó; nó trông phức tạp và đáng sợ, và tôi đã không làm việc trong c từ năm 1995)

3) Tôi từ bỏ FastCGI và viết mô-đun apache để gọi trực tiếp tập lệnh PHP của tôi để kiểm soát quyền truy cập. (Cũng có vẻ phức tạp, và kỹ thuật này sẽ yêu cầu một quy trình mới được sinh ra cho mọi yêu cầu để thực hiện PHP.)

Có ai có lời khuyên nào về cách để FastCGI làm những gì tôi muốn hoặc một cách hợp lý) thay thế đơn giản cho FastCGI?

Cám ơn bất cứ điều gì bạn có thể đề nghị

Trả lời

8

Tiếp cận của tôi cho các loại tình huống là sử dụng mod_xsendfile kết hợp với mod_rewrite. Những điều này có thể không xuất hiện để thực hiện những gì bạn muốn trước tiên, nhưng nếu bạn:

  1. Sử dụng quy tắc mod_rewrite để tạo bộ điều khiển phía trước (một tập lệnh PHP duy nhất xử lý tất cả yêu cầu gửi đến).
  2. Xác định tệp nào đang được yêu cầu bằng cách xem nội dung của $ _SERVER (có thể là $ _SERVER ['PATH_INFO']).
  3. Chèn lớp điều khiển/bảo mật truy cập của bạn tại đây.
  4. Sử dụng mod_xsendfile để gửi nội dung của tệp, nếu bảo mật vượt qua.

Thực chất bạn có thể triển khai bất kỳ hệ thống bảo mật nào bạn muốn theo cách này.

mod_xsendfile về cơ bản chỉ gửi một tệp theo cách chính xác giống như Apache, có tệp được truy cập trực tiếp. Nó ổn định và hoạt động tốt trong mọi tình huống tôi đã ném vào nó. Nó cũng nên 'chỉ làm việc' mà không có một gánh nặng rất lớn của thiết lập, mà bạn dường như đang đấu tranh với một chút.

+0

Tôi thích giải pháp đó! – Achronos

0

Bạn có thể muốn nhìn vào shell_exec()system(). Chúng sẽ cho phép bạn thực hiện các cmd của linux miễn là bạn đã kích hoạt nó trong cfg của bạn. Ngoài ra, đối với FastCGI tôi khuyên bạn cài đặt php5-fpm. Khá dễ dàng để làm # apt-get install php5-fpm

+0

Xin chào Timothy, cảm ơn bạn đã trả lời. Điều tôi cần là một cách để yêu cầu Apache sử dụng tập lệnh PHP để quyết định xem có cho phép truy cập vào một trang hay không. FastCGI thực sự làm việc tốt cho tôi, nó chỉ là không có cách nào tôi có thể nhìn thấy để có được chỉ thị 'FastCGIAccessChecker' để làm việc cho PHP. – Achronos

0

Tôi hiện đang làm việc trên một vấn đề tương tự - trong tình huống của tôi, tôi cần thiết để thiết lập người dùng từ xa (đã được xác thực) trong PHP. Nói một cách đơn giản, bạn đẩy cookie phiên và tên người dùng đã xác thực vào memcache (hãy xem phiên bản couchdb cho một hệ thống có khả năng mở rộng) từ tập lệnh PHP của bạn, sau đó mod đặt người dùng trong Apache và có thể áp dụng thông tin bằng cách sử dụng các tiêu chuẩn Apache acces quy tắc kiểm soát.

Điều này tránh được phí tổn bắt đầu các quy trình bổ sung/gói tất cả quyền truy cập trong mã PHP.

Xem câu hỏi và câu trả lời cho Populating remote user in apache log files from PHP session

1

Cám ơn các câu trả lời! Tôi khá thích kỹ thuật của ezzatron, nên làm việc với bất kỳ Apache nào mà không cần các công cụ tùy chỉnh.

Vì nó xảy ra tôi đã kết thúc đi với tùy chọn # 3 của tôi trước khi tôi đọc các bài trả lời:

tôi đã viết một module Apache để thực hiện công việc. Nó trang trại kiểm soát truy cập vào bất kỳ tài liệu apache có thể phục vụ, bằng cách sử dụng một subrequest - vì vậy nó hoạt động cho bất kỳ ngôn ngữ kịch bản hoặc chương trình CGI. Đối với một cấu hình PHP điển hình sử dụng php_module hoặc fastcgi, điều này quy mô khá tốt vì không có quá trình thêm là cần thiết.

Hóa ra API mô-đun của Apache không quá khó sử dụng, và tôi đoán C giống như đi xe đạp - bạn không bao giờ thực sự quên cách.

Các vấn đề liên quan