2008-10-08 34 views
12

Tôi đang lập trình một cái gì đó cho phép người dùng lưu trữ tài liệu và hình ảnh trên máy chủ web, để được lưu trữ và truy xuất sau này. Khi người dùng tải tệp lên máy chủ của tôi, PHP cho tôi biết loại tệp dựa trên tiện ích. Tuy nhiên, tôi e rằng người dùng có thể đổi tên một tệp zip thành somezipfile.png và lưu trữ nó, do đó giữ một tệp zip trên máy chủ của tôi. Có cách nào hợp lý để mở tệp đã tải lên và "kiểm tra" để xem liệu tệp đó có thực sự thuộc loại tệp đã nói không?Làm cách nào để biết liệu ai đó có giả mạo một loại tệp không? (PHP)

Trả lời

18

Magic number. Nếu bạn có thể đọc vài byte đầu tiên của tệp nhị phân, bạn có thể biết loại tệp đó là gì.

+0

số Magic không phải lúc nào tại sự bắt đầu. TGA, ví dụ, có họ ở cuối, tôi tin. –

+0

lưu ý rằng bằng cách dựa vào kiểm tra này, người dùng độc hại có thể chèn các byte ma thuật và sau đó viết mã PHP trong cùng một tệp để thử và thực thi một số mã trên máy của bạn – Jorre

+1

Bất kỳ ví dụ nào về cách thực hiện việc này? – CMCDragonkai

4

Sắp xếp. Hầu hết các loại tệp đều có một số byte dành riêng cho việc đánh dấu chúng để bạn không phải dựa vào phần mở rộng. Các trang web http://wotsit.org là một nguồn tài nguyên tuyệt vời cho việc tìm kiếm này cho một loại hình cụ thể.

Nếu bạn đang sử dụng hệ thống Unix, tôi tin rằng lệnh tập tin không dựa vào phần mở rộng, vì vậy bạn có thể giải quyết nó nếu bạn không muốn viết mã kiểm tra byte.

Đối PNG (http://www.w3.org/TR/PNG-Rationale.html)

Tám byte đầu tiên của một tập tin PNG luôn luôn chứa các giá trị sau:

(thập phân) 137 80 78 71 13 10 26 10

(hệ thập lục phân) 89 50 4e 47 0d 0a 1a 0a

(ASCII C ký hiệu) \ 211 PNG \ r \ n \ 032 \ n

2

Nhiều loại tệp có "magic numbers" ở đầu tệp để nhận dạng chúng, Bạn có thể đọc một số byte từ phía trước tệp và so sánh chúng với danh sách số ma thuật đã biết.

1

Trên hệ thống Unix, việc chụp đầu ra từ lệnh 'tệp' sẽ cung cấp thông tin đầy đủ.

8

Kiểm tra phần mở rộng PECL FileInfo cho PHP, có thể thực hiện tra cứu ma thuật MIME cho bạn.

2

Nếu bạn chỉ làm việc với hình ảnh, sau đó getimagesize() nên phân biệt một hình ảnh hợp lệ từ một giả.

$ php -r 'var_dump(getimagesize("b&n.jpg"));' 
array(7) { 
    [0]=> 
    int(200) 
    [1]=> 
    int(200) 
    [2]=> 
    int(2) 
    [3]=> 
    string(24) "width="200" height="200"" 
    ["bits"]=> 
    int(8) 
    ["channels"]=> 
    int(3) 
    ["mime"]=> 
    string(10) "image/jpeg" 
} 

$ php -r 'var_dump(getimagesize("/etc/passwd"));' 
bool(false) 

Giá trị sai từ việc lấy mẫu không phải là hình ảnh.

1

Là một lưu ý phụ, tôi gặp phải một vấn đề tương tự khi tôi phải tự kiểm tra kiểu của mình. Giao diện giao diện người dùng đến ứng dụng của tôi đã được thực hiện bằng flash. Các tệp đã được chuyển qua flash tới tập lệnh php. Khi tôi đang cố gắng thực hiện kiểm tra kiểu MIME bằng cách sử dụng php, kiểu luôn luôn trả về là application/octetstream vì nó đến từ flash.

Tôi phải triển khai mô hình loại số ma thuật. Tôi chỉ cần tạo một tệp xml có chứa loại tệp cùng với một số mẫu xác định được tìm thấy trong phần đầu của tệp. Khi tệp đã đến máy chủ, tôi đã thực hiện một số mẫu khớp với tệp xml và sau đó chấp nhận hoặc từ chối tệp. Tôi đã không nhận thấy bất kỳ hiệu suất thực sự giảm hoặc là tôi đã mong đợi.

Đây chỉ là một lưu ý nhỏ đối với bất kỳ ai có thể đang sử dụng đèn flash như có giao diện người dùng và cố gắng nhập kiểm tra tệp khi tệp được tải lên.

+0

Bạn đã sử dụng phương pháp nào để so sánh các tệp với tham chiếu của mình? –

+0

Trong tập tin xml, tôi đã có một bảng thông báo về vị trí mà chuỗi ma thuật có thể được tìm thấy trong tập tin. Vì vậy, tôi đọc số byte được chỉ định từ tệp và chuyển đổi nó thành hex và đã so sánh. – JustLogic

1

Cũng như xác định loại tệp, bạn có thể muốn xem các tệp có tệp khác được nhúng hoặc nối vào chúng. Điều này sẽ không may đòi hỏi một phân tích sâu sắc hơn về nội dung tập tin hơn là chỉ sử dụng "số ma thuật".

Ví dụ, http://quantumrook.wordpress.com/2007/06/06/hide-a-rar-file-in-a-jpg-file/ (loại đặc biệt của dữ liệu ẩn có thể dễ dàng làm việc xung quanh bằng cách tải và resaving vào một tập tin mới dữ liệu hình ảnh thực tế .. những người khác sẽ khó khăn hơn.)

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