2010-05-29 44 views
5

Tôi đang làm việc thông qua một cuốn sách mysql php cũ hơn được viết vào năm 2003. Tác giả sử dụng hàm include() để xây dựng các trang html bằng cách bao gồm các tệp header.inc, footer.inc, main.inc, v.v. Bây giờ tôi tìm ra điều này không được cho phép trong các thiết lập ini mặc định, (allow_url_include được đặt thành Off) sau khi tôi nhận được nhiều cảnh báo từ máy chủ.include() Tại sao tôi không nên sử dụng?

Tôi cũng nhận thấy rằng bạn có thể sử dụng bao gồm không có dấu ngoặc đơn. Tôi đã thử điều này và nó hoạt động và tôi không nhận được thông báo lỗi hoặc cảnh báo. Hai người khác nhau? Tức là, là bao gồm() khác với bao gồm?

+0

Đây có phải là câu hỏi bảo mật không? – rook

+0

bạn nên sử dụng nó ... – Artefacto

Trả lời

4

Việc sử dụng include() có thể giới thiệu tệp nội bộ bao gồm (LFI) hoặc Remote File Include(RFI) Vulnerably. Bạn nên thử và tránh sử dụng bao gồm, ví dụ: nếu bạn đang bao gồm HTML tốt hơn để viết print(file_get_contents($file)) hơn include($file). Tuy nhiên, cần phải có include() 'các tệp PHP cần thiết trong hầu hết các ứng dụng php để giảm trùng lặp mã.

Ngay cả khi việc bao gồm tệp từ xa bị vô hiệu hóa, nó vẫn có thể khai thác hệ thống bằng cách sử dụng Advanced LFI Attack.

Nếu bạn cần phải chấp nhận đầu vào người sử dụng trong một include(), sau đó bạn nên chắc chắn của nó trên một danh sách trắng:

$good_includes=array("contact","home","view"); 
if(in_array($_GET[page],$good_includes)){ 
    include("inc/".$_GET[page].".php"); 
} 
+0

Tại sao điều này lại bị bỏ phiếu? Có thể vẫn còn có liên quan cho các ví dụ từ cuốn sách người hỏi. Và đó là thú vị anyway. – mario

+0

print (file_get_contents ($ file)) không bao gồm ($ file) không chính xác hoán đổi cho nhau và các liên kết bao gồm tham chiếu đến việc sử dụng dữ liệu không được xác nhận trong các câu lệnh include, ngu ngốc và có khả năng gây hại cả cho file_get_contents và include. Đã bỏ phiếu. – Artefacto

+0

@Artefacto ** ... nếu bạn đang bao gồm HTML ... ** – rook

16

Đây là một sự hiểu lầm. Bạn có thể tắt tính năng bao gồm các tệp từ xa (sử dụng URL http://www.example.com/include.php thay vì đường dẫn hệ thống tệp). Bạn luôn có thể bao gồm các tệp cục bộ.

Lý do thứ hai là vì include không phải là chức năng bình thường mà là ngôn ngữ xây dựng. Giống như die, nó có thể được sử dụng có hoặc không có dấu ngoặc đơn. Nguồn: Manual

Bởi vì include() là một cấu trúc ngôn ngữ đặc biệt, không cần xung quanh dấu ngoặc đơn. Cẩn trọng khi so sánh giá trị trả lại.

+0

Đây là câu trả lời bảo mật như thế nào? (Câu hỏi này có một thẻ bảo mật ...) – rook

+0

@ The Rook Tôi không thấy bất kỳ dấu hiệu nào cho thấy OP đang hỏi về việc sử dụng các biến cho các tên bao gồm. Tôi nghĩ rằng thẻ 'security' đã được thêm vào do khía cạnh' allow_url_include'. –

+0

Có những thời điểm cụ thể khi bạn sử dụng dấu ngoặc đơn và các dấu ngoặc đơn khác khi bạn không sử dụng? Có thực hành tiêu chuẩn sử dụng chúng hay không? Có lý do gì mà họ không cần thiết? Là nó để đặt chúng ngoài các chức năng khác không phải là cấu trúc điều khiển? – aliov

-1

Có sự khác biệt lớn với include/require_oncerequire.

Sự khác biệt chính là báo cáo lỗi, nếu bạn sử dụng bao gồm trong ứng dụng của bạn PHP sẽ cố tải tệp nhưng nếu nó không tồn tại, nó sẽ ném lỗi không nghiêm trọng (nghĩa là tập lệnh của bạn sẽ không dừng), nếu bạn đang sử dụng require thì tập lệnh sẽ tạm dừng và ngừng xử lý.

Sử dụng require trên các tệp cơ bản cho ứng dụng của bạn và sử dụng include trong các mẫu của bạn bởi vì nếu có lỗi bạn có thể chỉ định không hiển thị lỗi và do đó người dùng sẽ không biết sự khác biệt miễn là mẫu bao gồm header.php

các chức năng này chủ yếu được sử dụng trên máy chủ của riêng bạn để bao gồm các tệp có liên quan đến ứng dụng của bạn.

nếu bạn bao gồm các tệp từ bên ngoài máy chủ của mình thì tôi sẽ sử dụng curl nếu được cài đặt hoặc file_get_contents().

Hy vọng điều này sẽ giúp bạn.

chỉ một ghi chú trên require vs require_once, require_once sẽ thêm logic để đảm bảo rằng tập tin không được bao gồm nhiều hơn một lần, tức là bạn không muốn khai báo kết nối cơ sở dữ liệu của bạn nhiều hơn một lần

+0

Không giải quyết vấn đề thực tế =/ – Matchu

+0

đối với việc hoàn toàn bên cạnh câu hỏi. – Artefacto

0

Chức năng include là tốt để kích hoạt các tệp. Nếu chúng tôi bao gồm các tập tin trong chu kỳ, điều này rất tốt. Nhưng nếu chúng tôi bao gồm các tệp tĩnh, chúng tôi nên sử dụng require. Hàm thứ hai làm trong phần bắt đầu của tập lệnh.

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