Đáng để hạn chế truy cập trực tiếp các tập tin chủ đề?


31

Thỉnh thoảng tôi vẫn chạy qua đoạn mã sau trong các chủ đề:

if ( ! defined('ABSPATH')) exit('restricted access');

Đó là sự khởi đầu của một số (tất cả?) Các tệp PHP trong một chủ đề và nó được cho là ngăn chặn truy cập trực tiếp vào tệp bằng các nguồn bất chính.

Tôi thấy rằng điều này không được bao gồm trong Twenty Ten hoặc Eleven và tôi chưa bao giờ thấy nó được đề xuất trong tài liệu chính thức của WordPress. Nó có vẻ là một ý tưởng tốt đối với tôi, nhưng tôi cũng không biết đủ về bảo mật để đánh giá nó và không thể tìm thấy nhiều với Google.

Đây có phải là một cái gì đó tôi nên có trong các chủ đề tùy chỉnh của tôi? Nếu vậy, nó nên có trong tất cả các tệp PHP hay chỉ một số?


7
Chỉ dành cho những độc giả sau này, điều này có thể được viết ngắn hơn và đẹp hơn:defined('ABSPATH') OR exit;
kaiser

hoặc thậm chí ngắn hơn :: defined('WPINC') ? : die();P
Tim Elsass

Tôi cũng tự hỏi liệu có đáng để đưa vào một số mã như thế này chỉ để tránh nhìn thấy các lỗi PHP về các hàm không xác định trong nhật ký lỗi của tôi không. Bots đôi khi dường như muốn truy cập trực tiếp vào các tệp này và tôi gặp lỗi như 'Gọi đến hàm không xác định query_posts ()' vì bootstrap WP chưa được tải
Matt Keys

Câu trả lời:


26

Thông thường, bạn không cần nó. Nhưng có ít nhất một trường hợp cạnh:

  • Nếu một tệp chủ đề là một phần mẫu ,
  • nó đang sử dụng các biến toàn cục từ ngữ cảnh gọi (tệp cha),
  • register_globalson,
  • nó chỉ sử dụng các biến này mà không có bất kỳ kiểm tra bảo mật nào

Một kẻ tấn công có thể gọi tệp này, đặt các biến bị thiếu bằng GEThoặc POSTlàm cho tệp chủ đề in chúng ra. Và sau đó một vấn đề bảo mật.

Vì vậy, lựa chọn tốt nhất không phải là kiểm tra ngữ cảnh như ví dụ từ ví dụ của bạn, mà là mã tốt: tránh các biến toàn cục, kiểm tra nội dung của chúng trước khi bạn in ra.

Trong một số trường hợp, tôi thêm kiểm tra ngữ cảnh khi tôi nghĩ người khác sẽ sử dụng mã của mình và thay đổi nó mà không cần bảo mật. Nó không đau.


Nếu một phần mẫu vẫn chứa ít nhất một lệnh gọi hàm gây ra lỗi nghiêm trọng PHP thì kịch bản này có còn khả thi không?
Chris_O

@Chris_O Phụ thuộc vào thứ tự xuất hiện.
fuxia

Làm cho ý nghĩa và hoàn toàn đồng ý về một lý do khác không sử dụng các biến toàn cục giữa các cuộc gọi tệp.
Chris_O

1
Luôn luôn tốt nhất để được an toàn hơn xin lỗi. Quá nhiều bảo mật không thể làm tổn thương, phải không?
Sean Berg

2
Nếu bạn làm mọi thứ đúng, bạn không nên sử dụng mã không cần thiết. Câu hỏi này là bằng chứng cho thấy nó làm cho mã khó theo dõi hơn.
fuxia
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.