2010-04-15 24 views
5

Tôi hiện đang cố tạo CMS bằng cách sử dụng PHP, hoàn toàn là vì lợi ích của giáo dục. Tôi muốn các quản trị viên có thể tạo nội dung, sẽ được phân tích cú pháp và lưu trên lưu trữ máy chủ ở dạng HTML thuần túy để tránh chi phí thực thi tập lệnh PHP sẽ phải chịu. Thật không may, tôi chỉ có thể nghĩ ra một vài cách để làm như vậy:Các tác động bảo mật của việc ghi tệp bằng cách sử dụng PHP

  • Đặt quyền ghi trên mọi thư mục mà CMS muốn viết tệp. Điều này nghe có vẻ như một ý tưởng tồi.
  • Đặt quyền ghi trên một thư mục cached duy nhất. Tập lệnh PHP sau đó có thể include hoặc fopen/fread/echo nội dung từ tệp trong thư mục cached theo thời gian yêu cầu. Điều này có lẽ có thể được thực hiện trong một thời trang Mediawiki-esque: một cái gì đó như index.php?page=xyz có thể đọc và echo nội dung từ cached/xyz.html khi chạy. Tuy nhiên, tôi cần phải đảm bảo sự tỉnh táo của $_GET['page'] để ngăn các biến thể khó chịu như index.php?page=http://www.bad-site.org/malicious-script.js.

Cá nhân tôi không quá hồi hộp bởi ý tưởng thứ hai, nhưng ý tưởng đầu tiên nghe có vẻ rất không an toàn. Ai đó có thể xin đề nghị một cách tốt để làm điều này?

EDIT: Tôi không có lợi khi tìm nạp dữ liệu từ cơ sở dữ liệu. Thời gian duy nhất tôi muốn lấy dữ liệu từ cơ sở dữ liệu sẽ là khi nội dung được lưu trữ. Thứ hai, tôi không có quyền truy cập vào memcached hoặc bất kỳ máy gia tốc PHP nào.

Trả lời

2

Vì bạn đang xây dựng một CMS, bạn sẽ phải chấp nhận rằng nếu người dùng muốn làm điều ác cho khách truy cập, họ rất có thể có thể. Đó là sự thật bất kể bạn lưu trữ nội dung của mình ở đâu.

Nếu trang web công cộng là tất cả nội dung tĩnh, không có gì sai khi cho phép CMS ghi tệp trực tiếp. Tuy nhiên, bạn sẽ muốn cấu hình máy chủ web để không thực hiện bất cứ điều gì trong bất kỳ thư mục nào có thể ghi được bởi CMS.

Mặc dù bạn không muốn nhấn cơ sở dữ liệu mỗi lần, bạn có thể thiết lập bộ nhớ cache để giảm thiểu số lần đọc cơ sở dữ liệu. Zend_Cache hoạt động rất độc đáo cho điều này và có thể được sử dụng khá hiệu quả như một thành phần độc lập.

+0

+1 để đề cập đến quyền thực thi. Tuy nhiên, tôi không đồng ý với điểm đầu tiên của bạn - bạn có thể làm cho khả năng của trình soạn thảo bị hạn chế như bạn muốn (nói bằng cách loại bỏ javascript). Ngoài ra nó không chỉ là khách truy cập bạn cần phải bảo vệ, nhưng tính toàn vẹn của máy chủ của bạn. – CurtainDog

+0

Tuyệt đối! Hạn chế mọi thứ có ý nghĩa, nhưng vào cuối ngày, người dùng vẫn có thể tạo một trang web có nội dung "Tôi là Jon Foo, anh trai của vị vua mới được tân trang của Nigeria, và tôi cần sự giúp đỡ của bạn để chuyển 42 triệu đô la đến Hoa Kỳ ... "Theo như bảo vệ máy chủ, chỉ cần đảm bảo bạn chỉ viết các tệp mà bạn được phép ghi tệp và không cho phép máy chủ web xử lý bất kỳ điều gì trong đó dưới dạng tập lệnh. Tôi không có ý định thực hiện bất kỳ âm thanh nào tầm thường - rất nhiều công việc cẩn thận được gọi - nhưng nó không vốn không an toàn, trong ước tính của tôi. – timdev

+0

Những người dùng làm điều ác cho khách truy cập không phải là một vấn đề, tôi cho rằng, vì nội dung sẽ được thêm vào và lưu vào bộ nhớ cache bởi một nhóm người đáng tin cậy. Tôi đã tò mò nếu sự cho phép viết trên một thư mục công cộng có thể được sử dụng bởi một khách truy cập độc hại như là một lỗ hổng tiềm năng. Cảm ơn bạn đã chỉ ra phần thực thi! Tôi không thể thiết lập bộ nhớ cache vào lúc này vì ngân sách là vấn đề rất quan trọng và chúng tôi sẽ có kế hoạch lưu trữ cung cấp cho chúng tôi PHP/MySQL với băng thông hợp lý và ít hơn. – susmits

1

Bạn nên đặt các trang của mình trong cơ sở dữ liệu và truy xuất chúng bằng cách sử dụng truy vấn SQL được tham số hóa.

+0

Như tôi đã đề cập ở trên, tôi đang cố gắng cắt giảm thời gian thực thi của tập lệnh. Tôi chắc chắn một chuyến đi đến cơ sở dữ liệu và ngược lại sẽ hơi đắt! Tôi không có quyền truy cập vào bộ tăng tốc PHP hoặc ghi nhớ. Tôi cho rằng tôi cũng sẽ chỉnh sửa câu hỏi đó! – susmits

0

Tôi muốn sử dụng tùy chọn thứ hai nhưng sửa đổi để các tệp được truy xuất bằng mod_rewrite thay vì hàm php tùy chỉnh.

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