2010-09-20 31 views
6

Tôi có một ứng dụng PHP.PHP: Cách vệ sinh tên tệp được tải lên?

Tôi cho phép người dùng tải tệp lên ứng dụng web của tôi.

Câu hỏi: Cách tốt nhất để tôi làm vệ sinh tên tệp của tài liệu được tải lên $_FILES["filename"]["tmp_name"] bằng PHP là gì?

CẬP NHẬT:

Tôi có thể lấy một MD5 của tên tập tin được tải lên và sử dụng như tên tập tin mới được giao? Nếu vậy, làm thế nào để làm điều đó trong PHP?

+0

Bạn có thể đưa ra định nghĩa rõ ràng về 'làm vệ sinh' không? Như trong MySQL? URL? – fredley

+0

Tôi đang tải các tệp lên máy chủ web của mình. Các tập tin có thể là hình ảnh, tài liệu, vv Tôi không muốn va chạm tên tập tin.Và tôi không muốn mọi người cố gắng tải lên tên tệp có thể không cho phép trên hệ thống tệp của tôi. – frooyo

+0

Bạn cũng nên biết loại tệp nào bạn cho phép chúng tải lên. Bạn không muốn ai đó có thể tải lên những thứ như tệp html/javascript. – Moses

Trả lời

2

Tôi sẽ chỉ chạy một regex đơn giản thay thế bất kỳ ký tự không phải chữ và số nào bằng dấu gạch dưới (hoặc chỉ xóa toàn bộ ký tự này). Hãy chắc chắn rằng bạn bảo toàn phần mở rộng của khóa học.

Nếu bạn muốn tiến xa hơn một chút, bạn có thể sử dụng tiện ích mở rộng ma thuật để đảm bảo tệp có cùng định dạng mà tiện ích mở rộng cho biết.

EDIT: Để tránh va chạm tên tệp trong thư mục, bạn có thể nối thêm md5 người dùng IP + thời gian hiện tại vào tên tệp.

+0

Điều gì xảy ra nếu họ tải lên 2 tài liệu cùng một lúc? – frooyo

+0

Thêm một số entropy bổ sung, sử dụng bộ đếm cho mỗi tệp bạn xử lý: –

+0

Nếu $ i được tăng cho mỗi tệp bạn xử lý: '$ filename = $ sanitizedFileName. md5 ($ _ SERVER ["REMOTE_ADDR"]. time(). $ i). $ extension; ' –

-2

Nếu bạn không chống mất tên tệp thực, điều tôi thường làm là tạo băm tên tệp và đặt tên tệp thành tên đó, nếu bất kỳ thứ gì bạn đang phát triển có tải ảnh sẽ giúp tránh xung đột hai tên tập tin được đặt tên giống nhau và ghi đè xảy ra.

hash('md5', $_FILES["filename"]["tmp_name"]); 
+0

Bạn có nghĩa là: ** hash ('md5', $ _FILES [" filename "] [" tmp_name "]) **? – frooyo

+0

Có, đối số đầu tiên bạn vượt qua là loại băm bạn muốn tạo và đối số thứ hai là chuỗi bạn muốn tạo băm. PHP Hash - http://www.php.net/manual/en/function.hash.php – jduren

+0

Tôi cũng sẽ đề nghị thêm Sam Days thực hành cũng như nơi bạn có thể thêm thời gian hiện tại vào tên tệp trước khi băm, điều đó sẽ tạo ra thậm chí còn nhiều tên tệp duy nhất. – jduren

3

Tôi đặt cược rằng bạn cũng lưu trữ một số thông tin về tệp trong cơ sở dữ liệu. Nếu điều này đúng, bạn có thể sử dụng khóa chính (ID) làm tên tệp trên máy chủ của mình và giữ nguyên tên tệp gốc trong cơ sở dữ liệu. Điều này giúp bạn linh hoạt hơn, bởi vì bạn có thể thao tác siêu dữ liệu mà không cần đổi tên tệp thực.

4

Để tránh trùng tên chỉ kiểm tra xem nhất định hoặc tạo ra tên tập tin chưa tồn tại:

do { 
    // Generate filename, eg.: 
    $filename = md5(uniqid()) . $fileExtension; 
} while (file_exists($filename)); 

Cung cấp cho bạn chắc chắn 100% rằng tên tập tin là duy nhất. Sử dụng md5 (hoặc bất kỳ thuật toán băm nào khác) đảm bảo rằng tên tệp được bảo mật - và dễ xử lý.

+2

Điều này không có ý nghĩa. Bạn đang dùng MD5 của hàm uniqid. Tại sao? – frooyo

+0

Đó là ví dụ duy nhất. Bạn có thể sử dụng tên tập tin gốc vv Điểm chính là bạn nên kiểm tra vòng lặp cho dù tên tệp đã tạo đã được sử dụng chưa. Nếu vậy hãy tạo lại tên tệp. – Crozin

+3

Lấy md5() của uniqid() không có ý nghĩa. Lấy md5() của tên tệp gốc (tức là một giá trị không đổi) trong một vòng lặp làm cho cảm giác ít hơn. :-) – Cucu

0

Thay vì khử trùng tên tệp do người dùng chỉ định, hãy sử dụng bất kỳ số nhận dạng duy nhất nào khác cho ảnh đó và lưu trữ làm tên tệp. Tôi thích sử dụng ID người dùng là số và luôn là duy nhất.

move_uploaded_file($_FILES["tmp_name"],"/home/yourname/".$user_id));

Sau đó bạn có thể lấy hình ảnh từ bất kỳ vị trí (ví dụ, S3 hoặc thậm chí máy chủ của riêng bạn) bằng cách chỉ cần biết ID của người dùng. Bạn thậm chí không cần một thuộc tính trong cơ sở dữ liệu của bạn để lưu trữ URL của hình ảnh.

0

Ciao, chức năng này cũng loại bỏ tất cả các điểm và sau đó tôi tạo chuỗi sạch với phần mở rộng.

function sanitaze_upload_file($data) 
{ 
    $imgName = $data; 
    $indexOFF = strrpos($imgName, '.'); 
    $nameFile = substr($imgName, 0,$indexOFF); 
    $extension = substr($imgName, $indexOFF); 
    $clean  = preg_replace("([^\w\s\d\-_~,;\[\]\(\)])", "", 
    $nameFile); 
    $NAMEFILE = str_replace(' ', '', $clean).$extension; 
    return $NAMEFILE; 
} 
Các vấn đề liên quan