php - Block certain files from being uploaded -


i need stop php, pl, cgi being uploaded website. how possible? i've tried many weird things , have no hope it, never work.

so yes, php, pl , cgi needs blocked.

code:

<?php session_start();  /**  * handles post uploads, generates filenames, moves files around , commits  * uploaded metadata database.  */  require_once 'classes/response.class.php'; require_once 'classes/uploadexception.class.php'; require_once 'classes/uploadedfile.class.php'; require_once 'includes/database.inc.php';  /**  * generates random name file, retrying until unused one.  *  * @param uploadedfile $file  *  * @return string  */ function generatename($file) {     global $db;     global $doubledots;      // start @ n retries, , --n until give     $tries = pomf_files_retries;     $length = pomf_files_length;     $ext = pathinfo($file->name, pathinfo_extension);      // check if extension double-dot extension and, if true, override $ext     $revname = strrev($file->name);     foreach ($doubledots $ddot) {         if (stripos($revname, $ddot) === 0) {             $ext = strrev($ddot);         }     }      {         // iterate until reach maximum number of retries         if ($tries-- === 0) {             throw new exception(                 'gave trying find unused name',                 500             ); // http status code "500 internal server error"         }          $chars = id_charset;         $name = '';         ($i = 0; $i < $length; ++$i) {             $name .= $chars[mt_rand(0, strlen($chars))];         }          // add extension file name         if (isset($ext) && $ext !== '') {             $name .= '.'.$ext;         }          // check if file same name exist in database         $q = $db->prepare('select count(filename) files filename = (:name)');         $q->bindvalue(':name', $name, pdo::param_str);         $q->execute();         $result = $q->fetchcolumn();     // if does, generate new name     } while ($result > 0);      return $name; }  /**  * handles uploading , db entry file.  *  * @param uploadedfile $file  *  * @return array  */ function uploadfile($file) {     global $db;     global $filter_mode;     global $filter_mime;      // handle file errors     if ($file->error) {         throw new uploadexception($file->error);     }      // check if mime type blocked     if (!empty($filter_mime)) {         if ($filter_mode == true) { //whitelist mode             if (!in_array($file->mime, $filter_mime)) {                 throw new uploadexception(upload_err_extension);             }         } else { //blacklist mode             if (in_array($file->mime, $filter_mime)) {                 throw new uploadexception(upload_err_extension);             }         }     }       // check if file same hash , size (a file same)     // exist in database; if does, return proper link     // , data. php deletes temporary file uploaded automatically.     $q = $db->prepare('select filename, count(*) count files hash = (:hash) '.                       'and size = (:size)');     $q->bindvalue(':hash', $file->getsha1(), pdo::param_str);     $q->bindvalue(':size', $file->size, pdo::param_int);     $q->execute();     $result = $q->fetch();     if ($result['count'] > 0) {         return array(             'hash' => $file->getsha1(),             'name' => $file->name,             'url' => pomf_url.rawurlencode($result['filename']),             'size' => $file->size,         );     }      // generate name file     $newname = generatename($file);      // store file's full file path in memory     $uploadfile = pomf_files_root . $newname;      // attempt move static directory     if (!move_uploaded_file($file->tempfile, $uploadfile)) {         throw new exception(             'failed move file destination',             500         ); // http status code "500 internal server error"     }      // need change permissions new file make world readable     if (!chmod($uploadfile, 0644)) {         throw new exception(             'failed change file permissions',             500         ); // http status code "500 internal server error"     }      // add database     if (empty($_session['id'])) {         // query if user not logged in         $q = $db->prepare('insert files (hash, originalname, filename, size, date, ' .                     'expire, delid) values (:hash, :orig, :name, :size, :date, ' .                         ':exp, :del)');     } else {         // query if user logged in (insert user id other data)         $q = $db->prepare('insert files (hash, originalname, filename, size, date, ' .                     'expire, delid, user) values (:hash, :orig, :name, :size, :date, ' .                         ':exp, :del, :user)');         $q->bindvalue(':user', $_session['id'], pdo::param_int);     }      // common parameters binding     $q->bindvalue(':hash', $file->getsha1(), pdo::param_str);     $q->bindvalue(':orig', strip_tags($file->name), pdo::param_str);     $q->bindvalue(':name', $newname, pdo::param_str);     $q->bindvalue(':size', $file->size, pdo::param_int);     $q->bindvalue(':date', date('y-m-d'), pdo::param_str);     $q->bindvalue(':exp', null, pdo::param_str);     $q->bindvalue(':del', sha1($file->tempfile), pdo::param_str);     $q->execute();      return array(         'hash' => $file->getsha1(),         'name' => $file->name,         'url' => pomf_url.rawurlencode($newname),         'size' => $file->size,     ); }  /**  * reorder files array file.  *  * @param  $_files  *  * @return array  */ function diversearray($files) {     $result = array();      foreach ($files $key1 => $value1) {         foreach ($value1 $key2 => $value2) {             $result[$key2][$key1] = $value2;         }     }      return $result; }  /**  * reorganize $_files array saner.  *  * @param  $_files  *  * @return array  */ function refiles($files) {     $result = array();     $files = diversearray($files);      foreach ($files $file) {         $f = new uploadedfile();         $f->name = $file['name'];         $f->mime = $file['type'];         $f->size = $file['size'];         $f->tempfile = $file['tmp_name'];         $f->error = $file['error'];         //$f->expire   = $file['expire'];         $result[] = $f;     }      return $result; }  $type = isset($_get['output']) ? $_get['output'] : 'json'; $response = new response($type);  if (isset($_files['files'])) {     $uploads = refiles($_files['files']);       try {         foreach ($uploads $upload) {             $res[] = uploadfile($upload);         }         $response->send($res);     } catch (exception $e) {         $response->error($e->getcode(), $e->getmessage());     } } else {     $response->error(400, 'no input file(s)'); } 

how?

php has no control on files before uploaded server. web server handle file upload , give access php file action. can php check mime type / file extension check if file uploaded valid , delete if not valid file need.


Comments

Popular posts from this blog

php - How to display all orders for a single product showing the most recent first? Woocommerce -

asp.net - How to correctly use QUERY_STRING in ISAPI rewrite? -

angularjs - How restrict admin panel using in backend laravel and admin panel on angular? -