Có một số giải pháp khác nhau. Nếu chỉ có thể có một tên tệp, một giải pháp basename() sẽ hoạt động.
Tuy nhiên, nếu nó có thể là con đường, một giải pháp phức tạp hơn là cần thiết
//assume current directory, but can be set anything. Absolute path of course
$basedir = dirname(__FILE__);
//assume our files are below document root.
//Otherwise use it's root dir instead of DOCUMENT_ROOT
$filename = realpath($_SERVER['DOCUMENT_ROOT'].$_GET['file']);
if (substr($filename,0,strlen($basedir)) !== $basedir) {
header ("HTTP/1.0 403 Forbidden");
exit;
}
đó cũng là một tùy chọn cấu hình PHP hữu ích open_basedir
Nguồn
2010-08-22 08:00:33
* (tham khảo) * http: //en.wikipedia. org/wiki/Directory_traversal – Gordon
Như @Starx đã chỉ ra, hãy cố gắng tránh sử dụng đường dẫn tệp làm số nhận dạng cho tài liệu (Có các mối quan tâm khác, ngoài việc truyền tải thư mục). (Ý tưởng của @MartIX 'về băm (md5) có thể giúp cho việc triển khai gọn gàng). Hơn nữa nó là một ý tưởng tốt ** không chạy máy chủ của bạn dưới dạng root **. Sử dụng một người dùng riêng biệt chỉ có các quyền trên hệ thống cần thiết để hoàn thành nhiệm vụ của mình. – zpea
(Đó là nếu bạn có nghĩa là có thể truy cập tệp chỉ có thể đọc được bởi người dùng gốc, như '/ etc/shadow'.'/Etc/passwd' có thể đọc được bởi bất kỳ người dùng nào trong Unix hiện đại, dĩ nhiên) – zpea