2010-07-09 20 views
5

Tôi đang xây dựng trang web nơi người dùng có thể tải lên các tệp mp3. Và, tôi muốn kiểm tra xem tệp có phải là tệp mp3 hay không. Những gì tôi cần biết là nếu có một chức năng php làm điều đó cho tôi.PHP Loại tệp thực

tôi đã cố gắng $_FILES['uploadedfile']['type']

Nhưng, tôi không làm việc như tôi muốn, bởi vì nó sẽ trả về các loại tập tin dựa trên phần mở rộng (Tôi đã thử nghiệm nó chỉ trên cửa sổ)

Vì vậy, câu hỏi là:

  1. Có một cách an toàn để làm điều đó với các hàm gốc php?
  2. Loại tệp dựa trên tiện ích, là sự cố php hoặc có liên quan đến hệ điều hành không?
  3. Bạn nghĩ gì về tôi ??

Cảm ơn.

+0

[cách kiểm tra xem tệp có phải là hình ảnh hoặc loại video trong phiên bản php 5.2.9 không?] (Http://stackoverflow.com/questions/3074527/how-to-check-whether-file-is-image-or -video-type-in-php-version-5-2-9) bao gồm cùng một cơ sở – Gordon

Trả lời

7

1- Có cách nào an toàn để thực hiện điều đó với các hàm gốc php?

Đối với MP3, không có chức năng gốc PHP, không.

fileinfo sử dụng chức năng "MIME sniffing" của hệ điều hành. Nếu được cài đặt, nó thường khá đáng tin cậy.

Hoặc, thư viện getID3 tuyên bố có thể trích xuất thông tin từ tệp MP3. Nếu bạn có thể nhận được một thời gian chơi từ tập tin, rất có thể nó là một tập tin MP3 hợp lệ.

2- Loại tệp dựa trên tiện ích, là sự cố php hoặc có liên quan đến hệ điều hành không?

Không. Trình duyệt xác định loại tệp (theo phần mở rộng thường) và gửi loại MIME. Như với bất kỳ dữ liệu đến, nó rất dễ dàng để giả mạo và không bao giờ có thể được tin cậy.

+1

+1 cho getID3. Tôi đã sử dụng nó trước để kiểm tra xem một bộ phim QuickTime có chứa gợi ý streaming hay không. Rất, rất hữu ích. –

1

Bạn muốn xem các loại MIME. Mở rộng fileinfo của PHP là cách ưu tiên để thực hiện việc này.

2

tôi sẽ kiểm tra này ra:

http://getid3.sourceforge.net/

Bạn có thể sử dụng để xác nhận rằng nó là một tập tin âm thanh và nhận được thông tin về nó.

1

Mở tệp sau khi tệp được tải lên và kiểm tra một vài byte đầu tiên để xem tệp có khớp với nội dung phải nằm trong tiêu đề tệp mp3 hay không.

+0

vài byte đầu tiên cũng có thể là ID3 –

+0

Tôi không nói những gì vài byte đầu tiên có thể được, vì vậy tôi không chắc chắn làm thế nào điều này áp dụng cho câu trả lời của tôi. Bạn có chắc chắn bạn không có ý nghĩa như một câu trả lời cho một trong những câu trả lời khác không? – GrandmasterB

3

Câu hỏi về MP3 là hơi len. Các tệp MP3 thường chứa một loạt các chaff ở đầu và/hoặc kết thúc không phải là các khung MP3 hợp lệ. Thông thường điều này là để giữ thẻ ID3, nhưng nó không phải là không phổ biến để đáp ứng MP3 với dữ liệu vô nghĩa ở cuối cho các lý do khác (ví dụ như cắt dòng ngây thơ).

Trong thực tế hầu như mọi thứ đều có thể là MP3 và nhiều tệp nhị phân tùy ý sẽ có một cái gì đó trông giống như một khung MP3 trong đó.Tìm kiếm thông tin ID3 và chiều dài (như trong câu trả lời của Pekka) là một cách tiếp cận heuristic tốt để có được ý tưởng nếu một tệp là có khả năng là là MP3, nhưng điều đó không đủ nếu những gì bạn nghĩ đến là liên quan đến bảo mật.

nó trả về kiểu tập tin dựa trên phần mở rộng (Tôi đã thử nghiệm nó chỉ trên cửa sổ)

Trên thực tế nó sẽ trả về chuỗi loại trình duyệt web của người dùng gửi nó, mà trên Windows sẽ được xác định bởi phần mở rộng tệp gốc nhưng trên Mac hoặc Linux có thể đến từ các nguồn khác. Dù bằng cách nào, giống như tên tập tin, nó không đáng tin cậy. Máy tính của người dùng có thể được thiết lập sai hoặc có thể cố ý gửi chuỗi loại phương tiện sai cho một tệp.

Có một cách an toàn để làm điều đó với các hàm gốc php?

Ý định của bạn với ‘an toàn’ là gì? Nếu mục tiêu của bạn là ngăn chặn mọi người tải lên các tệp MP3 thực sự là các loại tệp khác trong ngụy trang — thường cho mục đích tiêm nội dung HTML, Java hoặc Flash cho các cuộc tấn công qua nhiều trang, thì không có cách nào thực tế để thực hiện việc này. Bạn có thể tạo các tệp là các tệp MP3 hợp lệ và cũng có thể được hiểu là một loại khác cùng một lúc. (Xem các cuộc tấn công 'GIFAR', tương tự với MP3.)

Cuối cùng, cách tiếp cận duy nhất bảo vệ bạn khỏi các cuộc tấn công XSS là phục vụ các tệp không được tải lên không đáng tin cậy từ một tên máy chủ khác. trang web chính, do đó, cross-site-scripting vào nó không có gì. Một giải pháp một phần bạn cũng có thể xem xét thay thế hoặc cũng là để phục vụ tất cả các tệp của bạn với tiêu đề Content-Disposition: attachment (nếu bạn không cần lưu trữ hình ảnh sẽ được hiển thị nội tuyến trong một trang).

+0

Vâng, tôi không biết. Tôi luôn luôn thấy youtube cho phép bạn tải lên bất cứ điều gì nhưng, nếu không phải là một video, nó nói bạn "xin lỗi". Tôi nghĩ rằng tôi có khá nhiều thông tin tôi muốn. Cảm ơn. – mRt

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