2010-05-01 42 views
15

Hey .. câu hỏi của tôi là làm thế nào để ngăn chặn ai đó tải lên một vi rút hoặc một số mã độc hại với phần mở rộng bạn giả vờ ví dụ tôi có một trình tải lên tập tin pdf, bất cứ ai có thể tải lên một nhị phân với ngụy trang pdf có rất nhiều các chương trình để làm điều đó.PHP Tải lên tập tin tăng cường an ninh

Trả lời

1

Hãy xem phần mở rộng FileInfo của php.
Việc nhận dạng loại nội dung thực tế tương tự như unix file command.
Nhưng điều đó chỉ hữu ích đối với người dùng độc hại chỉ cần đổi tên, ví dụ: virus.exe đến virus.pdf. Nó không ngăn chặn việc tải lên một pdf có hại (sử dụng một số lỗi trong một hoặc nhiều trình đọc pdf phổ biến hơn).

13

Có một số mối lo ngại lớn nảy sinh khi tải tệp lên. Vấn đề đầu tiên là tập tin có thể không phải là tập tin bạn muốn, trong trường hợp này là một pdf. Biến số $_FILES['file_name']['type'] được kiểm soát bởi kẻ tấn công có thể không bao giờ được tin cậy. Giá trị này thường được sửa đổi bằng cách sử dụng mã khai thác hoặc sử dụng tamperdata.

1) Bước đầu tiên trong hệ thống Secuirty của bạn là để đảm bảo các tập tin có phần mở rộng .pdf:

if("pdf"!=substr($fileName, strrpos($fileName, '.') + 1)){ 
    die("Invalid File Type"); 
} 

2) Tiếp theo, bạn nên kiểm tra những gì tập gõ nó đang sử dụng php filetype() chức năng.

3) Một vấn đề nghiêm trọng là các tệp PDF này có thể khai thác các lỗ hổng như buffer overflows thường được tìm thấy trong phần mềm do Adobe tạo ra. Các tệp PDF này được sử dụng để phát tán vi rút trong một cuộc tấn công Drive By Download.

Giải pháp tốt nhất là cài đặt tường lửa ứng dụng web Mod_Security. Điều này sẽ ngăn chặn các cuộc tấn công như tiêm sql và xss từ nhấn ứng dụng web của bạn. Mod_Secuirty có thể được cấu hình để quét tất cả tải lên tệp cho vi rút bằng cách sử dụng modsec-clamscan.

+0

Cảm ơn bài đăng của bạn, tôi đã có tất cả bảo mật đó đã được đề cập, ngoại trừ mod_security tôi sẽ yêu cầu được cài đặt trên máy chủ lưu trữ của tôi. Cảm ơn dude :) – mandril

+0

@mandril Chào mừng bạn, tôi rất vui được giúp – rook

+2

Filetype() giúp đỡ như thế nào? Dường như với tôi như tất cả nó sẽ làm là cho bạn biết nếu tập tin là một tập tin so với thư mục. Có lẽ bạn có nghĩa là [finfo-file()] (http://www.php.net/manual/en/function.finfo-file.php)? –

1

Bạn không thể ngăn người khác tải lên vi-rút. Phương pháp tốt nhất là chạy quét vi-rút như clamscan trên tất cả các tệp được tải lên trang web của bạn.

Sử dụng kiểm tra mở rộng/kiểm tra MIME sẽ chỉ cho bạn biết rằng tệp được đặt tên chính xác, HOẶC có chữ ký MIME chính xác. Bạn sẽ không có cách nào để biết liệu có virus hay không cho đến khi bạn thực sự quét virus.

7

chúng tôi sử dụng kết hợp séc fileinfo + mở rộng tệp. Mặc dù các trình duyệt thường gửi loại mime mà bạn không bao giờ nên tin tưởng vì nó có thể là bị tấn công.

Trong trường hợp của chúng tôi, chúng tôi không chạy bất kỳ tệp nào trong máy chủ của chúng tôi. Vì vậy, những gì chúng tôi làm là để có một extension while list như (ví dụ): pdf jpg png vv .. và danh sách blacklisted mime extensions. Bằng cách này, chúng tôi tránh nguy cơ có tệp có phần mở rộng không khớp với loại mime.

khi tệp được lưu trong máy chủ, chúng tôi luôn buộc loại mime là application/octet-stream do đó, các tệp là luôn được tải xuống.

một cái gì đó như thế này:

<?php 

$allowed_types = array(
/* images extensions */ 
'jpeg', 'bmp', 'png', 'gif', 'tiff', 'jpg', 
/* audio extensions */ 
'mp3', 'wav', 'midi', 'aac', 'ogg', 'wma', 'm4a', 'mid', 'orb', 'aif', 
/* movie extensions */        
'mov', 'flv', 'mpeg', 'mpg', 'mp4', 'avi', 'wmv', 'qt', 
/* document extensions */        
'txt', 'pdf', 'ppt', 'pps', 'xls', 'doc', 'xlsx', 'pptx', 'ppsx', 'docx' 
         ); 


$mime_type_black_list= array(
# HTML may contain cookie-stealing JavaScript and web bugs 
'text/html', 'text/javascript', 'text/x-javascript', 'application/x-shellscript', 
# PHP scripts may execute arbitrary code on the server 
'application/x-php', 'text/x-php', 'text/x-php', 
# Other types that may be interpreted by some servers 
'text/x-python', 'text/x-perl', 'text/x-bash', 'text/x-sh', 'text/x-csh', 
'text/x-c++', 'text/x-c', 
# Windows metafile, client-side vulnerability on some systems 
# 'application/x-msmetafile', 
# A ZIP file may be a valid Java archive containing an applet which exploits the 
# same-origin policy to steal cookies  
# 'application/zip', 
         ); 


$tmp_file_extension = strtolower(pathinfo($file_name, PATHINFO_EXTENSION)); 

if(!strlen($tmp_file_extension) || (!$allow_all_types && 
    !in_array($tmp_file_extension,$allowed_types))) { 
    return false; 
} 

$finfo = new finfo(FILEINFO_MIME, MIME_MAGIC_PATH); 

if ($finfo) { 
    $mime = $finfo->file($file_name_tmp); 
} 
else { 
    $mime = $file_type; 
} 

$mime = explode(" ", $mime); 
$mime = $mime[0]; 

if (substr($mime, -1, 1) == ";") { 
    $mime = trim(substr($mime, 0, -1)); 
} 

return (in_array($mime, $mime_type_black_list) == false); 

ngoài này bạn có thể thêm virus scan sử dụng clamav + các php extension

1

Hai bước Câu trả lời đơn giản nhất để allow users to securely upload files in PHP là:

  1. Luôn lưu các tệp bên ngoài gốc tài liệu của bạn
  2. Writ e một tập lệnh PHP để phục vụ các tệp mà không cho phép chúng được thực thi

Điều đó sẽ dừng hầu hết các cuộc tấn công dựa trên tệp tải lên, nhưng không phải tất cả. Một giải pháp toàn diện hơn và đầy đủ bao gồm mỗi cách sau:

  1. Không bao giờ lưu trữ tệp bên ngoài gốc tài liệu, phân phối tệp qua tập lệnh proxy (như trên).
  2. Sử dụng finfo_file() để xác thực loại MIME của nội dung tệp thực tế.
  3. Khi tải lên, lưu vào tên tệp ngẫu nhiên thay vì tên tệp được cung cấp và sử dụng hàng cơ sở dữ liệu để giữ lại siêu dữ liệu (và do đó tập lệnh proxy của bạn có thể tìm thấy tệp chính xác để phân phát).
  4. Mã hóa/mã hóa nội dung tệp thực trên đĩa và làm cho tập lệnh của bạn giải mã/giải mã nó. Điều này ngăn người dùng độc hại tải lên tải trọng độc hại sau đó sử dụng lỗ hổng khác (ví dụ: LFI) để kích hoạt nó. Trong trường hợp này, base64_encode() sẽ cung cấp một biện pháp bảo vệ đầy đủ. (Nhưng nếu bạn có lỗ hổng khác trong ứng dụng của bạn, bạn nên thực sự khắc phục điều đó.)

Nếu bạn làm tất cả những điều trên, hình thức upload của bạn sẽ không có khả năng bao giờ là một nguồn dễ bị tổn thương.

+0

Đây là nơi đầu tiên tôi đọc về số điểm 4 của bạn đang được sử dụng với các tệp tải lên. Không có nơi nào khác nhìn thấy. + 1.Và tại sao nó lại được viết rất nhiều với những cái nhìn mâu thuẫn nhau, ở đây và php.net vì tình yêu ... đừng làm thế. không làm điều này. Tôi thích bạn đăng bài. – Joeme

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