2012-02-13 17 views
5

Tôi thường phải đối mặt với các nhận xét tiêu cực bất cứ khi nào tôi muốn có một tập lệnh PHP ghi đầu ra vào một tệp trên máy chủ.Làm thế nào để bạn cho phép PHP ghi vào một tệp mà không ảnh hưởng đến bảo mật máy chủ

Tôi sử dụng các chức năng fopen(), fwrite()fclose(). Cách duy nhất tôi biết làm thế nào để thực hiện điều này xảy ra là thiết lập quyền cho tệp đầu ra 0666 hoặc có quyền sở hữu bởi "không ai" (là người dùng mà PHP chạy dưới máy chủ web Apache của chúng tôi).

Vì vậy, nếu "0666" hoặc "do không ai sở hữu" là những rủi ro về bảo mật, bạn cho phép viết kịch bản PHP thành công như thế nào và an toàn?

Cảm ơn bạn đã chia sẻ hướng dẫn về chủ đề này.

+0

Vui lòng giải thích cách bạn 'xâm phạm bảo mật máy chủ' bằng cách cho phép tập lệnh của riêng bạn ghi vào một tệp. Việc viết thư cho DB có phải là một nguy cơ bảo mật không? Chỉ cần đảm bảo mã của bạn không có lỗi bảo mật. Miễn là mọi thứ được thực hiện đúng, thì không có vấn đề gì. – Flukey

+0

@Flukey ... trong đó có mục đích của câu hỏi của tôi. Tôi không thấy rõ vấn đề. Nhưng bất cứ lúc nào tôi đề cập đến tôi có một tập tin 0666 trên máy chủ hoặc một tập tin thuộc sở hữu của người dùng mà PHP chạy dưới, tôi nhận được lời bình luận đi dọc theo dòng ... "và tất nhiên bạn biết bạn đang mở máy chủ của mình để bảo mật rủi ro ". Tôi chỉ muốn viết kịch bản hiệu quả mà không ảnh hưởng đến bảo mật máy chủ. –

+1

Miễn là tệp được ghi vào bên ngoài thư mục Apache công cộng, thì tôi không thấy vấn đề gì. Ý kiến ​​của họ là không biết gì. – Flukey

Trả lời

3

Nếu bạn cần truy cập các tệp từ PHP sau khi chúng được tải lên thì chúng cần phải được lưu trữ với quyền cho phép máy chủ web (apache trong trường hợp này) truy cập chúng. Rủi ro mà mọi người nói đến là một số tập lệnh trên trang web của bạn có thể bị lừa khi phân phát tệp. Đó là một rủi ro giả định, nhưng đã xảy ra với nhiều Hệ thống quản lý nội dung. Để giảm thiểu rủi ro này:

  1. Làm cho tên tệp và đường dẫn không dễ đoán. Nếu người dùng có đường dẫn đến getfile.php?file=1.txt, họ có thể dễ dàng suy ra rằng có một số 2.txt. Crypt tên hoặc làm cho nó unsequenced.
  2. Tạo bất kỳ tập lệnh nào phục vụ các tệp xác nhận những thứ như người dùng đã đăng nhập, ủy quyền cho tài nguyên và xóa bất kỳ thứ gì từ tên tệp chứa đường dẫn để tránh các tham chiếu lừa đảo đến /etc/passwd và các loại tương tự.

Nếu bạn chỉ cần thả tệp ra và không bao giờ phục vụ hoặc truy cập tệp qua PHP một lần nữa, bạn có thêm một số tùy chọn. Sử dụng các lệnh chmod hoặc chown để người dùng apache không đọc được lệnh này. Nếu bạn muốn có thêm hoang tưởng, có một kịch bản cron di chuyển tệp (và đổi tên nó) thành một vị trí không xác định trong nguồn PHP. Ít nhất thì nếu máy chủ của bạn bị tấn công, kẻ xâm nhập không thể đi ngay vào thư mục, nhưng chúng tôi đang tiến tới điểm mà cuộc thảo luận sẽ chuyển sang bảo mật hệ điều hành.

+0

Cảm ơn @DuaneGran. Tôi sẽ đọc qua câu trả lời của bạn và tiêu hóa nó kỹ càng hơn. Nhưng phản ứng đầu tiên của tôi là những gì bạn có nghĩa là "Hash tên"? Và, làm thế nào để bạn làm điều đó và sử dụng nó trong kịch bản? –

+0

@ Dr.DOT Tôi đã nhầm lẫn khi đề xuất một băm vì đó là một cách. Lỗi của tôi. Khi điều đó xảy ra, câu hỏi gần đây này có câu trả lời về các hàm crypt/giải mã dễ dàng sẽ hoạt động đối với tên tệp: http://stackoverflow.com/questions/9262109/php-simplest-two-way-encryption –

-1

Nguy cơ là nếu thư mục có thể ghi đó nằm trong khu vực có thể truy cập được với thế giới bên ngoài. Sau đó, những người có công cụ thích hợp và biết cách viết bất kỳ thứ gì họ muốn vào thư mục đó ... hoặc tệp. Sau đó, họ có thể đặt phần mềm độc hại vào đó hoặc tạo một chương trình lừa đảo trên trang web của bạn.

Thực sự họ có thể làm đủ mọi thứ để thỏa hiệp bạn. Tôi đã thấy điều này trên các máy chủ của riêng mình và chưa thực sự tìm thấy giải pháp phù hợp cho điều này.

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