Tôi không biết điều này có xảy ra hay không, nhưng tôi sẽ thử.Kịch bản tải lên hình ảnh bảo mật đầy đủ
Trong giờ qua tôi đã nghiên cứu về an toàn tải lên hình ảnh. Tôi đã học được rằng có rất nhiều chức năng để kiểm tra việc tải lên.
Trong dự án của tôi, tôi cần phải an toàn với hình ảnh được tải lên. Cũng có thể có một số lượng thực sự lớn và nó có thể đòi hỏi nhiều băng thông, vì vậy việc mua một API không phải là một lựa chọn.
Vì vậy, tôi đã quyết định nhận một tập lệnh PHP đầy đủ để tải lên hình ảnh an toàn thực sự. Tôi cũng nghĩ rằng nó sẽ giúp ích cho nhiều người ở ngoài kia, bởi vì không thể tìm được một người thực sự an toàn. Nhưng tôi không phải là chuyên gia về php, vì vậy nó thực sự đau đầu cho tôi để thêm một số chức năng, vì vậy tôi sẽ yêu cầu cộng đồng này giúp đỡ để tạo ra một kịch bản đầy đủ của REALLY an toàn hình ảnh tải lên.
Các chủ đề thực sự tuyệt vời ở đây (tuy nhiên, họ chỉ nói những gì cần thiết để thực hiện thủ thuật, nhưng không phải cách thực hiện điều này, và như tôi đã nói tôi không phải là chủ trên PHP, vì vậy tôi không thể để làm điều này tất cả bởi bản thân mình): PHP image upload security check list https://security.stackexchange.com/questions/32852/risks-of-a-php-image-upload-form
nói tóm lại, họ đang nói rằng đây là những gì cần thiết để tải lên hình ảnh an ninh (tôi sẽ trích dẫn từ trang ở trên):
- Tắt PHP chạy bên trong thư mục tải lên bằng cách sử dụng .httacce ss
- Không cho phép tải lên nếu tên tệp chứa chuỗi "php".
- Chỉ cho phép các tiện ích mở rộng: jpg, jpeg, gif và png.
- Chỉ cho phép loại tệp hình ảnh.
- Không cho phép hình ảnh có hai loại tệp.
- Thay đổi tên hình ảnh. Tải lên thư mục con không phải thư mục gốc.
Ngoài ra:
- lại quá trình hình ảnh sử dụng GD (hoặc Imagick) và lưu hình ảnh xử lý. Tất cả những người khác chỉ là nhàm chán cho tin tặc "
- Như đã chỉ ra, sử dụng move_uploaded_file() cho bất kỳ tải lên nào"
- Nhân tiện, bạn muốn rất hạn chế về thư mục tải lên của mình. Những địa điểm này là một trong những góc tối nơi nhiều người khai thác
xảy ra. Điều này hợp lệ đối với mọi loại tệp tải lên và mọi ngôn ngữ lập trình
ngôn ngữ/máy chủ. Kiểm tra
https://www.owasp.org/index.php/Unrestricted_File_Upload- Level 1: Kiểm tra phần mở rộng (file mở rộng kết thúc với)
- Level 2: Kiểm tra kiểu MIME ($ file_info = getimagesize ($ _ FILES [ 'image_file']; $ file_mime = $ file_info [' mime '];)
- Cấp 3: Đọc 100 byte đầu tiên và kiểm tra xem chúng có bất kỳ byte nào trong phạm vi sau đây không: ASCII 0-8, 12-31 (thập phân)
- Cấp 4: Kiểm tra số ma thuật trong tiêu đề (10-20 byte đầu tiên của tệp).Bạn có thể tìm thấy một số các tập tin tiêu đề byte từ đây:
http://en.wikipedia.org/wiki/Magic_number_%28programming%29#Examples- Bạn có thể muốn chạy "is_uploaded_file" trên $ _FILES [ 'my_files'] [ 'tmp_name'] là tốt. Xem
http://php.net/manual/en/function.is-uploaded-file.php
Dưới đây là một phần quan trọng của nó, nhưng vẫn còn đó không phải là tất cả. (Nếu bạn biết một cái gì đó nhiều hơn mà có thể giúp đỡ để làm cho tải lên thậm chí safier, xin vui lòng chia sẻ.)
NÀY LÀ GÌ CHÚNG TÔI GOT VỚI DOANH NGHIỆP
Main PHP:
function uploadFile ($file_field = null, $check_image = false, $random_name = false) { //Config Section //Set file upload path $path = 'uploads/'; //with trailing slash //Set max file size in bytes $max_size = 1000000; //Set default file extension whitelist $whitelist_ext = array('jpeg','jpg','png','gif'); //Set default file type whitelist $whitelist_type = array('image/jpeg', 'image/jpg', 'image/png','image/gif'); //The Validation // Create an array to hold any output $out = array('error'=>null); if (!$file_field) { $out['error'][] = "Please specify a valid form field name"; } if (!$path) { $out['error'][] = "Please specify a valid upload path"; } if (count($out['error'])>0) { return $out; } //Make sure that there is a file if((!empty($_FILES[$file_field])) && ($_FILES[$file_field]['error'] == 0)) { // Get filename $file_info = pathinfo($_FILES[$file_field]['name']); $name = $file_info['filename']; $ext = $file_info['extension']; //Check file has the right extension if (!in_array($ext, $whitelist_ext)) { $out['error'][] = "Invalid file Extension"; } //Check that the file is of the right type if (!in_array($_FILES[$file_field]["type"], $whitelist_type)) { $out['error'][] = "Invalid file Type"; } //Check that the file is not too big if ($_FILES[$file_field]["size"] > $max_size) { $out['error'][] = "File is too big"; } //If $check image is set as true if ($check_image) { if (!getimagesize($_FILES[$file_field]['tmp_name'])) { $out['error'][] = "Uploaded file is not a valid image"; } } //Create full filename including path if ($random_name) { // Generate random filename $tmp = str_replace(array('.',' '), array('',''), microtime()); if (!$tmp || $tmp == '') { $out['error'][] = "File must have a name"; } $newname = $tmp.'.'.$ext; } else { $newname = $name.'.'.$ext; } //Check if file already exists on server if (file_exists($path.$newname)) { $out['error'][] = "A file with this name already exists"; } if (count($out['error'])>0) { //The file has not correctly validated return $out; } if (move_uploaded_file($_FILES[$file_field]['tmp_name'], $path.$newname)) { //Success $out['filepath'] = $path; $out['filename'] = $newname; return $out; } else { $out['error'][] = "Server Error!"; } } else { $out['error'][] = "No file uploaded"; return $out; } } if (isset($_POST['submit'])) { $file = uploadFile('file', true, true); if (is_array($file['error'])) { $message = ''; foreach ($file['error'] as $msg) { $message .= '<p>'.$msg.'</p>'; } } else { $message = "File uploaded successfully".$newname; } echo $message; }
Và biểu mẫu:
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" enctype="multipart/form-data" name="form1" id="form1"> <input name="file" type="file" id="imagee" /> <input name="submit" type="submit" value="Upload" /> </form>
Vì vậy, những gì tôi yêu cầu là trợ giúp bằng cách đăng đoạn mã giúp tôi (và mọi người khác) làm cho Kịch bản tải lên hình ảnh này trở nên cực kỳ an toàn. Hoặc bằng cách chia sẻ/tạo tập lệnh đầy đủ với tất cả các đoạn mã được thêm vào.
Ai đó có thể cho biết lý do khiến bài đăng của tôi bị giảm giá? Nhìn vào quan điểm và cách hữu ích của chủ đề này là dành cho người khác, tôi không nghĩ rằng điều này là đúng. – Simon
Vì tôi tiếp tục nhận được upvotes trên câu trả lời của tôi về điều này, hãy để tôi giải thích những downvotes về câu hỏi của bạn: Stack tràn là một nơi để tìm sự giúp đỡ nếu bạn có vấn đề với mã của bạn. Đây không phải là nơi để tìm kiếm sự cải thiện về mã làm việc ([Code Review] (http://codereview.stackexchange.com/) là trang web cho điều đó), và cũng không phải là nơi để tìm kiếm hoặc yêu cầu hướng dẫn. Đơn giản chỉ vì (như bạn thấy), nó phải viết một nửa cuốn sách để đưa ra một câu trả lời tốt và thích hợp. Số lượt xem đơn giản chỉ vì bạn đã cung cấp tiền thưởng cho nó. Không phải vì tất cả mọi người cần điều này :) – icecub
@icecub Tôi chắc chắn vẫn còn những người đang tìm kiếm câu trả lời này và những người rất vui vì bạn đã trả lời nó. – Simon