2011-11-24 49 views
18

Documents nói:Mục đích của is_uploaded_file() là gì?

trả về true nếu file có tên theo tên tập tin được tải lên qua HTTP POST

Làm sao $_FILES['blah']['tmp_name'] có thể không phải là kết quả của một POST tải lên? PHP đã tạo tên tệp này.

này rất hữu ích để giúp đảm bảo rằng người dùng độc hại đã không cố gắng để lừa kịch bản vào làm việc trên các tập tin mà trên đó nó không nên làm việc - ví dụ,/etc/passwd.

Tôi hiểu rằng tôi nên kiểm tra kỹ nội dung và kích thước tệp. Nhưng làm cách nào kẻ tấn công có thể kiểm soát bất kỳ tên tệp tin tạm thời temp nào của tệp được tải lên?

Hoặc thực hiện một số kiểm tra khác?

Cảm ơn bạn đã tiết kiệm ánh sáng.

+1

Hiệu chỉnh: 'is_uploaded_file()' not 'is_upload_file()'. – MacMac

+0

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

+0

@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. –

Trả lời

9

Vâng, bạn có thể vượt qua bất kỳ số nào chuỗi thành is_uploaded_file.

Chắc chắn, nếu bạn vượt qua điều gì đó thẳng ra khỏi $_FILES thì dĩ nhiên, nó sẽ luôn trả về true, nhưng nếu bạn tự tạo lập luận thì có thể không.

+0

+1 để được chuyển thẳng đến điểm. Cảm ơn Jon và Tomalak. –

24

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").

1
bool is_uploaded_file (string $filename) 

Trả về TRUE nếu tệp được đặt tên theo tên tệp được tải lên qua HTTP POST. Điều này rất hữu ích để giúp đảm bảo rằng một người dùng độc hại đã không cố gắng lừa tập lệnh làm việc trên các tệp mà nó không hoạt động - ví dụ,/etc/passwd.

Loại kiểm tra này đặc biệt quan trọng nếu có bất kỳ cơ hội nào được thực hiện với tệp được tải lên có thể tiết lộ nội dung của người dùng hoặc thậm chí cho người dùng khác trên cùng một hệ thống.

Đối với hoạt động đúng đắn, hàm is_uploaded_file() cần một cuộc tranh cãi như

$_FILES['userfile']['tmp_name'], 

- tên của các tập tin được tải lên trên máy của khách hàng

$_FILES['userfile']['name'] 

không hoạt động.

nguồn: php manual

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