Download Speed/connection Limiting

Discussion in 'PHP' started by noney2004, May 16, 2010.

  1. #1
    Hi, i've been using a script called leechviet for a while now and my server cant seem to handle the rising number of people using it. it allows for users to download files through my site.

    so i want to be able to limit dl speed to eg. 100kbps per connection and only permit 1 connection per ip.

    how would i go about doing this? and if possible detect that user is currently downloading X number of files right now and not let them start more dls.


    like i see that lot of download sites can restrict their dl speeds as well as only allow one file to be downloaded at a single time.



    thanks so much


    i really need this cause my server keeps returning error 500 due to insanely high server loads.
    site: roflwaffles.net
     
    noney2004, May 16, 2010 IP
  2. roopajyothi

    roopajyothi Active Member

    Messages:
    1,302
    Likes Received:
    11
    Best Answers:
    0
    Trophy Points:
    80
    #2
    Just us this to prevent the Downland Speed

    
    
    <?php
    
    // Allow direct file download (hotlinking)?
    // Empty - allow hotlinking
    // If set to nonempty value (Example: example.com) will only allow downloads when referrer contains this text
    define('ALLOWED_REFERRER', '');
    
    // Download folder, i.e. folder where you keep all files for download.
    // MUST end with slash (i.e. "/" )
    define('BASE_DIR','/home/user/downloads/');
    
    // log downloads?  true/false
    define('LOG_DOWNLOADS',true);
    
    // log file name
    define('LOG_FILE','downloads.log');
    
    // Allowed extensions list in format 'extension' => 'mime type'
    // If myme type is set to empty string then script will try to detect mime type 
    // itself, which would only work if you have Mimetype or Fileinfo extensions
    // installed on server.
    $allowed_ext = array (
    
      // archives
      'zip' => 'application/zip',
    
      // documents
      'pdf' => 'application/pdf',
      'doc' => 'application/msword',
      'xls' => 'application/vnd.ms-excel',
      'ppt' => 'application/vnd.ms-powerpoint',
      
      // executables
      'exe' => 'application/octet-stream',
    
      // images
      'gif' => 'image/gif',
      'png' => 'image/png',
      'jpg' => 'image/jpeg',
      'jpeg' => 'image/jpeg',
    
      // audio
      'mp3' => 'audio/mpeg',
      'wav' => 'audio/x-wav',
    
      // video
      'mpeg' => 'video/mpeg',
      'mpg' => 'video/mpeg',
      'mpe' => 'video/mpeg',
      'mov' => 'video/quicktime',
      'avi' => 'video/x-msvideo'
    );
    
    
    
    ####################################################################
    ###  Hotlinking prevention module by Roopa
    ####################################################################
    
    // If hotlinking not allowed then make hackers think there are some server problems
    if (ALLOWED_REFERRER !== ''
    && (!isset($_SERVER['HTTP_REFERER']) || strpos(strtoupper($_SERVER['HTTP_REFERER']),strtoupper(ALLOWED_REFERRER)) === false)
    ) {
      die("Internal server error. Please contact system administrator.");
    }
    
    // Make sure program execution doesn't time out
    // Set maximum script execution time in seconds (0 means no limit)
    set_time_limit(0);
    
    if (!isset($_GET['f']) || empty($_GET['f'])) {
      die("Please specify file name for download.");
    }
    
    // Get real file name.
    // Remove any path info to avoid hacking by adding relative path, etc.
    $fname = basename($_GET['f']);
    
    // Check if the file exists
    // Check in subfolders too
    function find_file ($dirname, $fname, &$file_path) {
    
      $dir = opendir($dirname);
    
      while ($file = readdir($dir)) {
        if (empty($file_path) && $file != '.' && $file != '..') {
          if (is_dir($dirname.'/'.$file)) {
            find_file($dirname.'/'.$file, $fname, $file_path);
          }
          else {
            if (file_exists($dirname.'/'.$fname)) {
              $file_path = $dirname.'/'.$fname;
              return;
            }
          }
        }
      }
    
    } // find_file
    
    // get full file path (including subfolders)
    $file_path = '';
    find_file(BASE_DIR, $fname, $file_path);
    
    if (!is_file($file_path)) {
      die("File does not exist. Make sure you specified correct file name."); 
    }
    
    // file size in bytes
    $fsize = filesize($file_path); 
    
    // file extension
    $fext = strtolower(substr(strrchr($fname,"."),1));
    
    // check if allowed extension
    if (!array_key_exists($fext, $allowed_ext)) {
      die("Not allowed file type."); 
    }
    
    // get mime type
    if ($allowed_ext[$fext] == '') {
      $mtype = '';
      // mime type is not set, get from server settings
      if (function_exists('mime_content_type')) {
        $mtype = mime_content_type($file_path);
      }
      else if (function_exists('finfo_file')) {
        $finfo = finfo_open(FILEINFO_MIME); // return mime type
        $mtype = finfo_file($finfo, $file_path);
        finfo_close($finfo);  
      }
      if ($mtype == '') {
        $mtype = "application/force-download";
      }
    }
    else {
      // get mime type defined by admin
      $mtype = $allowed_ext[$fext];
    }
    
    // Browser will try to save file with this filename, regardless original filename.
    // You can override it if needed.
    
    if (!isset($_GET['fc']) || empty($_GET['fc'])) {
      $asfname = $fname;
    }
    else {
      // remove some bad chars
      $asfname = str_replace(array('"',"'",'\\','/'), '', $_GET['fc']);
      if ($asfname === '') $asfname = 'NoName';
    }
    
    // set headers
    header("Pragma: public");
    header("Expires: 0");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Cache-Control: public");
    header("Content-Description: File Transfer");
    header("Content-Type: $mtype");
    header("Content-Disposition: attachment; filename=\"$asfname\"");
    header("Content-Transfer-Encoding: binary");
    header("Content-Length: " . $fsize);
    
    // download
    // @readfile($file_path);
    $file = @fopen($file_path,"rb");
    if ($file) {
      while(!feof($file)) {
        print(fread($file, 1024*8));
        flush();
        if (connection_status()!=0) {
          @fclose($file);
          die();
        }
      }
      @fclose($file);
    }
    
    // log downloads
    if (!LOG_DOWNLOADS) die();
    
    $f = @fopen(LOG_FILE, 'a+');
    if ($f) {
      @fputs($f, date("m.d.Y g:ia")."  ".$_SERVER['REMOTE_ADDR']."  ".$fname."\n");
      @fclose($f);
    }
    
    ?>
    
    
    PHP:

    That's it!

    Thanks
     
    roopajyothi, May 16, 2010 IP
  3. vetrivel

    vetrivel Peon

    Messages:
    147
    Likes Received:
    1
    Best Answers:
    0
    Trophy Points:
    0
    #3
    Hi Roopa,
    Nice code and i just copied this to my local for future use.
    I just wondering where you added a code to prevent the download speed ?


     
    vetrivel, May 16, 2010 IP
  4. roopajyothi

    roopajyothi Active Member

    Messages:
    1,302
    Likes Received:
    11
    Best Answers:
    0
    Trophy Points:
    80
    #4
    Dude he said that he can already prevent it by using his current script

    My script provides

    * Hotlinking protection & automatic mime type detection with predefined mime type settings for following extensions: zip, pdf, doc, xls, ppt, exe, gif, png, jpg, mp3, wav, mpeg, mpg, mpe, mov, avi

    * This Script can log downloads in plain text file. Log file includes: IP, date/time, filename. You Can turn this feature on/off.
    Based on IP He can prevent it to downlaod no. of simulatenous files to be downloaded!


    If you need to prevent the speed add this too

    
    $speed = 50; //in KB's. Here its 50KB
    
    $file = fopen($file_location,'r');
    while($temp = fread($file,round($speed*1024))){
        echo $temp;
        flush();
        sleep(1);
    }
    fclose($file);
    
    PHP:
     
    roopajyothi, May 17, 2010 IP