2010-01-19 38 views
21

Tôi đang cố gắng giúp một người bạn di chuyển một trang web từ một khách sạn web này sang một khách sạn khác. Nơi cũ đã bị đóng, tôi chỉ có một tập tin tar phẳng của những gì có trong đó.Quyền nào cho tập lệnh/thư mục PHP?

Trang web chứa tài liệu HTML và có thể tải xuống một ứng dụng Java nhỏ (được tải trên điện thoại di động) để gửi dữ liệu đến trang web.

Ứng dụng Java di động đã gửi một chuỗi đến URL=<HOST>/php/register.php. Tập lệnh php này bao gồm một tập lệnh php khác (../inc/db_login.php), được kết nối với một DB SQL sử dụng $link=mysql_connect(). Một tệp khác, register.php, đã chèn SQL để đưa dữ liệu mới được gửi vào DB.

Câu hỏi của tôi là cơ bản, nơi tôi nên đặt 2 tệp PHP này trên trang web mới và những quyền mà thư mục và tệp phải có?

Máy chủ web cũ rõ ràng có các thư mục /php/inc. Không ai trong số này tồn tại trên máy chủ web mới. Tôi có nên tạo chúng không? Họ nên có giấy phép gì? Tôi đoán lý do có mật khẩu trong một tệp PHP riêng biệt là bảo mật. Thư mục /php/inc có thể có các quyền khác nhau.

Máy chủ mới có thư mục:

  • /httpdos
  • /httpsdos
  • /cgi-bin
  • /conf (và một số người khác có thể không thích hợp)

Câu hỏi của tôi

  1. Phần mở rộng tệp (.php) có nghĩa là gì đó với máy chủ: như tập lệnh PHP được bao gồm trong mã HTML (giữa <?...?>, máy chủ có cần xem hậu tố tệp hay không liên quan? (Tôi hiểu rằng các máy chủ phản ứng trên <?...?>, tất nhiên)

  2. nên các tập tin công cộng (register.php trong trường hợp của tôi) được đặt trong thư mục httpdocs/ hoặc làm máy chủ (apache tôi nghĩ) phản ứng trên một cái gì đó và lấy nó trong một thư mục khác?

  3. Nếu tập lệnh PHP có quyền R-X (đọc và thực thi), --X (thực thi) hoặc R-- (đọc)? Từ quan điểm hệ điều hành, tôi đoán apache chỉ đọc các tệp này, có nghĩa là chúng phải là R--, nhưng điều này có nghĩa là nếu dịch vụ PHP bị "ngừng", máy khách sẽ nhận được tất cả mã PHP trong trình duyệt của mình (?). Tôi thích nó là --X nhưng vì đây không phải là nhị phân hay cũng không có #!, tôi đoán nó phải là --R?

  4. Nếu tập lệnh PHP công khai có thể được đặt trong một thư mục khác (ví dụ: /php thay vì /httpdocs) thì cần /php (và tập lệnh nào) để được phép ?. Tôi đoán máy chủ phải biết về thư mục /php này (hoặc có mặc định thông thường không?)

  5. Tập lệnh PHP được bao gồm (../inc/db_login.php, có chứa mật khẩu SQL) không được theo /httpdocs Tôi đoán vậy. Điều này có nghĩa là số register.php của tôi bao gồm một tệp không nằm trong phụ đề /httpdocs. Điều này có hiệu quả không? Máy chủ có cần biết không?

Tôi hiểu bạn có thể cần biết cấu hình máy chủ. Chỉ cần giả định mặc định trong câu trả lời của bạn (và bạn có thể biết nó được thay đổi nếu nó ở đâu).

Trả lời

46

Thư mục phải có quyền thực thi để có thể sử dụng được. Thông thường, đây là 0755. Các tập lệnh PHP chạy qua mod_php không được thực thi mà là đọc; 0644 sẽ đủ cho điều này. Thư mục phải được ghi để cần phải được sở hữu bởi người dùng máy chủ web đang chạy dưới dạng. Có thể có thêm mối quan ngại về quyền, ví dụ: SELinux, nhưng ở trên sẽ giúp bạn có được thông tin cơ bản.

Tài liệu không được người dùng khác hoặc khách hàng bên ngoài truy cập phải là 0600, thuộc sở hữu của người dùng máy chủ web và nằm bên ngoài DocumentRoot. Lưu ý rằng việc chạy mod_php trong Chế độ An toàn sẽ ngăn chặn các tập lệnh bao giờ bao gồm bất kỳ thứ gì bên ngoài DocumentRoot; một lỗ hổng đáng tiếc.

+0

Cảm ơn câu trả lời của bạn. Tôi sẽ đặt register.php trong httpdocs/php. Bây giờ tôi đã cố gắng tạo/inc và bao gồm ../../inc/db_login.php, nhưng việc tạo/inc đã bị từ chối ... nên db_login.php được đặt trong cgi-bin sau đó ?. Và nếu apache đang ở trong chế độ an toàn, thì db_login phải nằm trong cây httpdocs ... có phải đó là một nguy cơ an toàn không? –

+0

Không có gì khác hơn là CGI script nên trong 'cgi-bin'. Có, có tập tin cấu hình theo DocumentRoot là một nguy cơ bảo mật tiềm năng; PHP có thể giải quyết vấn đề này bằng cách có tùy chọn cấu hình chỉ định một thư mục bổ sung có thể được bao gồm một cách rõ ràng. Nhưng nó không. –

+0

Nhưng nếu cả hai register.php và db_login.php đều nằm dưới gốc html doc và quyền của chúng là như nhau, thì độ lợi (security wise) là gì để có chúng trong 2 tệp khác nhau. Tôi nghĩ rằng ý tưởng là để có "bảo mật hơn" xung quanh các mật khẩu được bao gồm trong db_login ...? Nó không phải là một nguy cơ mà mã được cho khách hàng nếu PHP không? Một lần nữa, rất nhiều người cảm ơn thời gian của bạn./C –

1

Tôi đã mã hóa một chức năng để giải quyết các vấn đề quyền trong cả hai PHP/SuPHP và tương tự:

function realChmod($path, $chmod = null) 
{ 
    if (file_exists($path) === true) 
    { 
     if (is_null($chmod) === true) 
     { 
      $chmod = (is_file($path) === true) ? 644 : 755; 

      if (in_array(get_current_user(), array('apache', 'httpd', 'nobody', 'system', 'webdaemon', 'www', 'www-data')) === true) 
      { 
       $chmod += 22; 
      } 
     } 

     return chmod($path, octdec(intval($chmod))); 
    } 

    return false; 
} 

Có thể đó là hữu ích cho bạn.

+0

Bạn nên xem xét việc sử dụng octal literals thay vì xử lý với octdec() cruft, và sử dụng '| =' thay cho '+ ='. –

+1

Bạn đang sử dụng tập lệnh PHP để sửa các quyền trên tập lệnh PHP? Nếu các điều khoản của máy chủ không được chạy và không cho phép các tập lệnh PHP chạy, thì tập lệnh này cũng sẽ không chạy. Mặc dù nếu bạn sửa chữa quyền của tập lệnh này theo cách thủ công, thì bạn có thể sử dụng nó để thực hiện khôi phục hàng loạt các tệp khác. Có thể chỉ cần sử dụng 'chmod -R' nhanh hơn từ dòng lệnh. – MidnightLightning

+0

@MidnightLightning: Vẫn có thể chạy các tập lệnh PHP qua CLI ngay cả khi nó không hoạt động đúng trong máy chủ web, giả sử bạn có quyền truy cập trình bao khóa học. Ngoài ra, 'chmod -R' có thể nguy hiểm, tốt hơn nên sử dụng' tìm kiếm' đúng cách. –

1

1) Các tệp kết thúc bằng đuôi mở rộng .php sẽ được Apache chuyển tới trình biên dịch PHP. Nếu cấu hình thích hợp không được thiết lập để làm như vậy, các tệp PHP được phục vụ dưới dạng tệp văn bản của máy chủ. Dòng cấu hình Apache "AddHandler php5-script php" trong tệp httpd.conf là phương thức thiết lập PHP5 này.

2) register.php cần truy cập tại http://www.example.com/php/register.php, vì ứng dụng java đang tìm kiếm, vì vậy trong thư mục htdocs của Apache, cần phải có thư mục "php" với tệp register.php trong đó.

3) Tệp PHP cần quyền truy cập đọc bởi người dùng đang chạy dịch vụ Apache. Sử dụng PHP như một mô-đun Apache không có 'dịch vụ' để nói về điều đó tách biệt với PHP. Thay vào đó, dịch vụ Apache, khi nó nhận được một yêu cầu cho một tệp PHP, thực hiện một cuộc gọi shell tới tệp nhị phân PHP để phân tích cú pháp tệp và chuyển dịch vụ Apache thành kết quả mà nó phục vụ cho máy khách. Chỉ khi bạn đang sử dụng PHP từ dòng lệnh (thiết lập CLI) thì các script sẽ cần sự cho phép thực thi và bắt đầu bằng một dòng #!/path/to/php-bin.

4) Tệp được yêu cầu (register.php) cần phải nằm trong htdocs để được Apache phân phối. Nếu PHP đang chạy với chế độ "Safe Mode" bị vô hiệu hóa, register.php có thể bao gồm một tệp nằm ngoài thư mục htdocs.

5) Đường dẫn "../inc/db_login.php" liên quan đến tập lệnh PHP đã được tải xuống ban đầu (register.php), vì vậy, vì register.php nằm trong htdocs/php/register.php, nên đặt db_login.php tại htdocs/inc/db_login.php.

+0

Điểm 3: Thiết lập CLI và CGI đều cần quyền thực thi. –

0

Tất cả các tệp PHP dự định được giải quyết trực tiếp qua URL có thể nằm trong cùng thư mục với nội dung tĩnh (đây là cách thực hành thông thường). Thực hành tốt là có ít nhất một thư mục nằm ngoài thư mục có thể nhìn thấy được từ máy chủ web để giữ các tệp bao gồm, nhưng đường dẫn PHP bao gồm vẫn nên bao gồm '.'.

tôi khuyên bạn nên không đặt rất nhiều thư mục phi tiêu chuẩn trong hệ thống tập tin gốc của bạn - webroot mặc định khác nhau theo từng phân phối, nhưng tôi thường đi với một cái gì đó như:

/var/www/htdocs - như tài liệu root /usr/local/php - để bao gồm các tệp

Rõ ràng nếu bạn định chạy chrrot máy chủ web của mình, chúng phải được ánh xạ tương ứng.

Tất cả các tệp phải có thể đọc được bởi uid mà máy chủ web chạy, tuy nhiên nếu bạn có thể hạn chế những gì có thể ghi bởi uid này càng nhiều càng tốt thì bạn đóng một vectơ tấn công tiềm năng.

Tôi thường đi với thiết lập dirs của tôi như drwxrwSr-x thuộc sở hữu của một thành viên của một nhóm webdev với quyền sở hữu nhóm như nhóm webdev, (uid httpd không thuộc nhóm webdev) và tệp do đó -rw -rw-r-- Vì vậy, bất kỳ ai trong nhóm webdex đều có thể thay đổi tệp và uid httpd chỉ có thể đọc tệp.

1) thực hiện các tập tin có phần mở rộng (.php) có nghĩa là một cái gì đó đến máy chủ:

Có - đi đọc hướng dẫn cài đặt PHP.

C.

9

file Set php để 640

Đối an ninh tối đa bạn nên thiết lập quyền tối thiểu, mà là .

  • Các chủ sở hữu 6 sẽ là một tải lên các tập tin.
  • nhóm 4 sẽ là người phục vụ tệp. Biến apache thành viên nhóm.
  • không ai 0 nghĩa là không có người dùng nào khác có thể đọc tệp này. Điều quan trọng vì các tập lệnh php đôi khi có mật khẩu và các dữ liệu nhạy cảm khác.

Không bao giờ cho phép mọi người đọc đọc tập lệnh php.

lệnh hữu ích:

chmod 640 file.php 
chown user:group file.php 
usermod -a -G group apache 

gì các lệnh này được thực hiện:

  1. Thay đổi quyền sở hữu của file.php nên người dùng có thể đọc và viết, nhóm đọc.
  2. Thay đổi quyền sở hữu tệp.php, thành tên người dùng và tên nhóm đã chọn.
  3. Thêm apache vào nhóm để apache có thể phục vụ tệp. Nếu không, 640 sẽ không hoạt động.
Các vấn đề liên quan