Trong biểu mẫu hiện tại, is_uploaded_file
kiểm tra xem tệp tải lên có được bật không (nếu không nó không thể là tệp được tải lên) và tên tệp được cung cấp trên thực tế đã được tạo bởi PHP (tôi biết điều này khi xem nguồn).
Đây không phải là thực sự hữu ích, vì nếu không có vấn đề trong quá trình tải lên sau đó
is_uploaded_file($_FILES['blah']['tmp_name'])
sẽ luôn luôn trả true
.
Tuy nhiên, hãy xem xét rằng $_FILES
có "chỉ" có sẵn kể từ PHP 4.1.0, trong khi is_uploaded_file
xuất hiện đầu tiên với PHP 4.0.3. Kết luận có vẻ hợp lý ở đây là thật khó để xử lý tệp được tải lên hoạt động an toàn trước khi siêu kết nối $_FILES
được cung cấp. Nếu không có gì khác, không superglobals có thể được tiêm vào, và rất dễ dàng như vậy với kích hoạt register_globals
- vốn từng là một điểm đau khác với tính bảo mật của PHP.
Nếu một người đang viết mã ngày hôm nay và sử dụng $_FILES
như một người được cho là, thì tôi muốn nói is_uploaded_file
trong việc thực hiện hiện tại là "vô dụng" vì không có vector tấn công có thể lừa bạn xử lý tệp "xấu".
Tuy nhiên, cũng có một cách khác để xem xét mọi thứ: is_uploaded_file
được đảm bảo hoạt động chính xác ngay bây giờ và trong tương lai, miễn là nó có sẵn, bất kể cơ chế tải tệp lên là gì và làm cho chúng có sẵn cho lập trình viên . Có lẽ ngay bây giờ nó không cung cấp bất cứ điều gì cụ thể, nhưng nó trừu tượng hơn khái niệm "tải lên tệp an toàn" đi kèm với bảo đảm. Tôi nghĩ rằng không có sự bảo đảm như vậy cho $_FILES
(một lần nữa, mặc dù tôi muốn xem xét nó là hồi quy nếu hiện trạng thay đổi "cho tồi tệ hơn").
Hiệu chỉnh: 'is_uploaded_file()' not 'is_upload_file()'. – MacMac
Nó cũng dư thừa vì 'move_uploaded_file()' thực hiện kiểm tra rất giống nhau lần nữa. – mario
@mario: Không, đó không phải là dự phòng chút nào, bởi vì bạn không bị buộc phải gọi với người khác; bạn có thể sử dụng chúng một cách cô lập. –