2013-02-21 37 views
5

Tại thời điểm này tôi làm điều đó như thế này:Chặn truy cập kịch bản trực tiếp vào một tập tin

Trong một tập tin, cho phép gọi nó là file_one.php, tôi có

define('ROOT', realpath(dirname(__FILE__))); 

require_once(ROOTPATH . '/file_two.php'); 

Và trong file_two.php Sau đó tôi có điều này tại top:

if (! defined('ROOT')) 
    exit; 

Vì vậy, các nội dung của file_two.php chỉ có thể được truy cập nếu ROOT được xác định, trong đó xảy ra trong file_one.php. Nếu bạn cố gắng truy cập trực tiếp file_two.php nó sẽ không hoạt động, phải không? Có bất kỳ sai sót nào trong phương pháp này không?

+5

Một ý tưởng thậm chí còn tốt hơn là đặt nó bên ngoài webroot nếu có thể –

+0

Đó là cách CodeIgniter dường như làm điều đó, vì vậy nên an toàn chủ yếu. Mặc dù tôi đồng ý với bài đăng ở trên rằng nếu đây là vấn đề, chỉ cần di chuyển nó ra khỏi docroot –

Trả lời

1

Chuyển đổi bình luận John Conde đến một câu trả lời:

Cách tốt nhất để đảm bảo một tập tin không thể được truy cập trong trình duyệt là bằng cách đặt nó bên ngoài webroot.

Bạn nên có thư mục có tên www hoặc public_html hoặc tương tự, chứa tệp trang web của bạn. Vâng, trong thư mục chứa thư mục đó, bạn có thể đặt một thư mục includes và có các tệp chỉ truy cập tập lệnh trong đó. Bằng cách này, chúng hoàn toàn không thể truy cập được từ web, nhưng các tập lệnh vẫn có thể truy cập chúng.

1

Đúng như bạn nói. Nếu ai đó gõ trực tiếp vào trình duyệt /../../file_two.php thì nó sẽ thoát. Khi tệp được tải một cách độc lập, không bao gồm, ROOT không được xác định.

Hãy nhớ rằng trong một tệp PHP bao gồm những tệp khác và một tệp khác và khá nhiều kết thúc bằng một tệp duy nhất ở cuối. Vì vậy, nếu biến truy cập trực tiếp của bạn không được xác định ở đâu đó TRƯỚC KHI séc, nó sẽ không cho phép truy cập.

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