Bất cứ khi nào tôi làm việc với PHP (thường là) Tôi thường làm việc trên hộp Windows, tuy nhiên tôi (cố gắng) phát triển các ứng dụng độc lập nền tảng; một điểm chính của vấn đề là việc sử dụng các phân cách thư mục.Phân tách thư mục PHP, buộc dấu gạch chéo; không xâm nhập
Như nhiều người biết, làm bất kỳ hệ thống tệp nào hoạt động trong môi trường Windows trong PHP, bạn có thể sử dụng dấu gạch chéo chuyển tiếp thay cho ngược, và PHP sắp xếp nó ra dưới mui xe. Điều này là tất cả tốt khi nói đến việc sử dụng chuỗi ký tự để vượt qua một đường dẫn đến fopen()
hoặc bất cứ điều gì; nhưng khi truy xuất đường dẫn, có thể là __FILE__
hoặc mở rộng với realpath()
, tất nhiên đường dẫn được truy xuất bằng cách sử dụng các dấu gạch chéo thích hợp của hệ điều hành. Ngoài ra, tôi đã nhận thấy một số mâu thuẫn trong dấu gạch chéo. Một hoặc hai lần __DIR__
đã nối một (một dấu chéo ngược) và realpath()
quá (Tôi thích dấu gạch chéo, nhưng không liên tục)
Đây rõ ràng là một vấn đề để so sánh chuỗi, vì thay vì thực hiện:
compare_somehow('path/to/file.php', __DIR__);
Vì lợi ích của độ tin cậy, tôi phải đi:
compare_somehow('path/to/file.php', rtrim(strtr(__DIR__, '\\', '/'), '/') . '/');
Điều này có vẻ như rất nhiều công việc. Tôi có thể thả nó vào một chức năng, chắc chắn; bây giờ tôi bị mắc kẹt với một sự phụ thuộc hàm tùy ý trong tất cả mã OO của tôi.
Tôi hiểu rằng PHP không hoàn hảo, và cần phải thực hiện, nhưng chắc chắn phải tồn tại một số giải pháp bất khả tri trên nền tảng để buộc truy cập hệ thống tập tin truy xuất đường dẫn bị cắt hoặc ít nhất là cách không xâm nhập chức năng độc lập lớp cho mục đích này.
Tóm tắt câu hỏi (s):
- Có một số kỳ diệu (mặc dù đáng tin cậy) workaround, hack, hoặc để buộc PHP đá đường dẫn hệ thống tập tin trở lại về phía trước ào ạt tấn công không phụ thuộc vào hệ điều hành máy chủ ?
- Tôi sẽ giả định câu trả lời là không có ở trên, vì vậy hãy tiếp tục; tôi có thể thực hiện những điều khoản nào để thực thi dấu gạch chéo (hoặc bất kỳ lựa chọn nào, thực sự là) làm dấu tách thư mục? Tôi giả sử thông qua chức năng lọc nói trên, nhưng bây giờ nó nên đi đâu?
Chuyển tiếp dấu gạch chéo cho mọi thứ. Ngay cả khi bộ tách hệ điều hành máy chủ lưu trữ là #*&@
.
bạn đã xem [DIRECTORY_SEPARATOR] (http://www.php.net/manual/en/dir.constants.php) chưa? – vascowhite
@vascowhite - Chắc chắn là có. Tuy nhiên, tôi không thấy nó có lợi ích gì. ''path'.DS.'to'.DS.'file.php'' nếu tôi đặt tên nó là' DS' nhưng thậm chí đó là một nỗi đau. Ngoài ra, đường dẫn do người dùng cung cấp (* tệp cấu hình, vv *) vẫn cần phải là 'strtr()' -ed hoặc sử dụng 'DIRECTORY_SEPARATOR'. – Dan
Tại sao bạn so sánh đường dẫn? Bạn không thể chỉ kiểm tra xem tệp hoặc thư mục có tồn tại bằng cách sử dụng các hàm của PHP không? Đó sẽ là hệ điều hành bất khả tri phải không? – vascowhite