سلام . در این پست آموزشی میخوام بصورت ساده و تیتر وار به نکاتی اشاره کنم که با استفاده از اونها  امنیت اسکریپت خودتون رو بالا ببرید.

1- فقط به کاربران عضو اجازه آپلود فایل رو بدید. شما میتونید از کد کپتچا هم برای جلوگیری از کارهای مخرب بات ها استفاده کنید.
2- اول از همه در فرم آپلودتون مقادیر MAX_FILE_SIZE ٬ upload_max_filesize و max_file_uploads رو محدود کنید:

ini_set('post_max_size', '40M'); 
ini_set('upload_max_filesize', '40M');
ini_set('max_file_uploads', 10);

با استفاده از کد زیر هم میتونید حجم فایل رو چک کنید:
if ($fileInput['size'] > $sizeLimit)

3- با استفاده از تابع move_uploaded_file() فایل آپلود شده رو به مکان مناسبی از سرور انتقال بدید و همچنین بوسیله تابع is_uploaded_file() از انتقال فایلها مطمئن بشید.
4- هیچوقت فایل رو با نام اصلی خودش در سرور ذخیره نکنید. میتونید با استفاده توابع تولید رشته یا عدد تصادفی نام فایل رو عوض کرده و بعد ذخیره کنید.

$uploadStoragePath = '/file_storage';
$fileInput = $_FILES['image'];

if (fileInput['error'] != UPLOAD_ERR_OK)
    ; //handle upload error here

$temporaryName = $fileInput['tmp_name'];
$extension = pathinfo($fileInput['name'], PATHINFO_EXTENSION);

$name = bin2hex(mcrypt_create_iv(32, MCRYPT_DEV_URANDOM)); //true random id

move_uploaded_file($temporaryName, $uploadStoragePath.'/'.$name.'.'.$extension);

5- فایلهای آپلود شده رو به فولدری بیرون از public_html انتقال بدید. این کار باعث میشه تا هیچ فایلی قابلیت اجرا شدن رو نداشته باشه. همچنین با استفاده از فایل htaccess. میتونید از اجرا شدن فایلهای php جلوگیری کنید:

   SetHandler none
    SetHandler default-handler
    Options -ExecCGI
    php_flag engine off

فایل htaccess. رو باید داخل فولدر آپلود قرار بدید.

6- شما باید نوع فایلهایی که توسط کاربر(که میتونه یک هکر باشه)  آپلود میشه رو قبل از ذخیره چک کنید. به مثال زیر توجه کنید:

// FILEINFO_MIME set to return MIME types, will return string of info otherwise
$fileinfo = new finfo(FILEINFO_MIME);
$file = $fileinfo->file($_FILE['filename']);

$allowed_types = array('image/jpeg', 'image/png');
if(!in_array($file, $allowed_types))
{
    die('Files of type' . $file . ' are not allowed to be uploaded.');
}
// Continue

7- میتونید از یک انتی ویروس برای پیدا کردن فایلهای آلوده استفاده کنید.
8- برای حصول اطمینان از آلوده نبون تصاویر میتونید از Imagick یا  GD استفاده کنید:
مثالی از Imagick:

try {
    $uploadedImage = new Imagick($uploadedFile);
    $attributes = $uploadedImage->identifyImage();
    $format = $image->getImageFormat();
    var_dump($attributes, $format);
} catch (ImagickException $exception) {
    //handle damaged or corrupted images
}
  • اگر شما هم راه دیگری برای افزایش امنیت اسکریپت آپلود دارید پیغام بدید تا اضافه بشه.