2011-11-17 29 views
12

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à #*&@.

+2

bạn đã xem [DIRECTORY_SEPARATOR] (http://www.php.net/manual/en/dir.constants.php) chưa? – vascowhite

+1

@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

+0

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

Trả lời

8

Như tôi đã nhận xét, tôi không thể hiểu tại sao bạn phải làm điều này (tôi muốn được mô tả nhanh về vấn đề cụ thể mà bạn đang giải quyết), nhưng đây là giải pháp có thể sử dụng đầu ra của __FILE__ làm ví dụ: -

$path = str_replace('\\', '/', __FILE__); 

Việc này (nên?) hoạt động bất kể * dấu gạch chéo được hệ điều hành trả về (tôi nghĩ).Không may là tôi không nhận thức được "một số cách giải quyết (hack) đáng tin cậy (dù đáng tin cậy), hack, hay nói cách khác là buộc PHP phải lùi lại về phía trước các đường dẫn hệ thống tập tin bị cắt, bất kể hệ điều hành máy chủ" khác với điều này là gì. Tôi tưởng tượng nó có thể được bao bọc trong một lớp trợ giúp, nhưng điều đó vẫn mang lại cho bạn một sự phụ thuộc đơn độc trong mã của bạn.

+0

Cảm ơn @vascowhite - Tôi đã, vào lúc này, bọc chức năng nói trong lớp trợ giúp (* cùng với các chức năng liên quan khác *) để mọi thứ đều bị cắt giảm và thư mục luôn bị dấu gạch chéo. – Dan

+0

Ngoài ra, về nhận xét của bạn; Tôi đã làm so sánh cho "thư mục ảo" để nói chuyện. Tôi sẽ giải thích trong câu hỏi. – Dan

+0

Tôi chỉ sử dụng một lớp trợ giúp. 'Path :: normalize ($ path, $ expand);' với mở rộng tùy chọn qua 'realpath()'. Nó bình thường hóa 'DIRECTORY_SEPARATOR' thành'/', gắn thêm'/'vào các thư mục, và (* bởi tham số boolean tùy chọn *) sẽ mở rộng đường dẫn trước khi thực hiện bình thường hóa. – Dan

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