Announcement

Collapse
No announcement yet.

Protected Files download page with vB login verification

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • Protected Files download page with vB login verification

    This is a project we whipped up, hope it's useful to someone else.

    filepage.php
    PHP Code:
    <?php
    /*
    Created by FXRider 2003. 
    This is an attempt to keep the location of files a secret that are on FTP of a 
    vBulliten forums website. This was done to avoid using the vB attachments database.
    The hope is that the files are available for users, but not directly by links.
    This allows us to keep the attachments on the forums turned off but still be able
    to host files and prevent direct links to them from other sites. The new table that
    we add will be used to derive the number of dowloads per file and track usage.
    Users have to be logged into the forum to login to the files page.
    Files included: filepage.php filelogin.php filepage2.php fileprotect.php
    Vb Updates necessary:     Add the above php files to the forums folder.
                Add file_stats TABLE to the vB forums database...
    CREATE  TABLE file_stats(
     access_time INT( 10  )  NOT  NULL  PRIMARY KEY,
     file_name varchar( 30  ) ,
     accessor varchar( 30  ) 
    );

    This is being posted in hopes that the code can be tightened up where 
    necessay. I threw this together with snipits of code from various 
    places and designed it specifically for use with vBulliten forums.
    It does the job currently, but should be considered buggy 
    and not trusted till you verify that it is delivering the desired
    result if used.

    To Do:
    1)convert to all php, I'm new at this, I need some time to figure out how.
    2)Make a loop to display  files table with a list. 
    3)Convert common static strings to Constants defined at the beggining  
    of each file.

    */
    error_reporting(7);
    header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");                // Date in the past
    header("Last-Modified: " gmdate("D, d M Y H:i:s") . " GMT");         // always modified
    header("Cache-Control: no-store, no-cache, must-revalidate, private");  // HTTP/1.1
    header("Cache-Control: post-check=0, pre-check=0"false);
    header("Pragma: no-cache");                                      // HTTP/1.0

    include("./global.php");                         // vB globals
    //setcookie("FDusername","");                        // clear our cookie    
    //setcookie("FDpassword","");

    if ($HTTP_GET_VARS['HTTP_POST_VARS']['action'] == $HTTP_POST_VARS['action']) {    // passed args
      
    unset($HTTP_POST_VARS['action']);

      }
    $HTTP_POST_VARS['action'] = trim($HTTP_POST_VARS['action']);            // trim args
    ?>



    <html>

    <head>
    <!-- insert your title here -->
    <title>YOURSITE.com Filz Page</title>
    </head>

    <!-- Background white, links blue (unvisited), navy (visited), red
    (active) -->
    <body bgcolor="#8484FF" text="#ffffff" link="#000000"
     vlink="#2719DD" alink="#ff0000">
    <table border="0" cellpadding="0" cellspacing="0" width="90%">
    <tr>
        <td width="10%">    <!-- Insert your favorite gif and URL here -->
            <A  align="left" HREF="http://www.SOMESITE.org/"><IMG SRC="http://www.YOURSITE.com/SOMELOGO.gif" ALT="[ Exercise your right to free speech! ]"></A>
        </td>
        <td width="90%" align="center">        
            <font size="6" color="#2719DD" ><b>
            <! set the title on your page here -->
            YOURSITE.com Files Download Login Page
            </b></font>
            
        </td>    
    </tr>

    </table> 
    <P ALIGN="left">

    <!-- Insert your favorite gif and URL here -->
    <!--
    <A HREF="http://www.SOMESITE.org/"><IMG SRC="http://www.YOURSITE.com/SOMELOGO.gif" ALT="[ Exercise your right to free speech! ]"></A>
    </p>
    -->
    <!-- set the title on your page here --><!--
    <h1 align="center">YOURSITE.com Files Download Login Page</h1>
    -->
    <!--
    <hr width="95%" size="8" >
    -->

    <br><br><br>

    <!--    input box for user ID and password  //-->
    <div align="center">
      <table border="0" cellpadding="0" cellspacing="0">
      
        <!-- Set the path to your vB forums folder here -->      
        <form action="http://www.YOURSITE.com/forums/filelogin.php" method="post"> <!-- next page -->
          <tr> 
            <td nowrap><smallfont>Enter your username and password below:<br><smallfont>(entries are case sensitive)</smallfont></smallfont></td>
          </tr>
          <tr> 
            <td nowrap>
              <input type="hidden" name="s" value="$session[sessionhash]">
              <input type="text" class="bginput" name="username" size="15">
              <input type="password" class="bginput" name="password" size="15">
              <input type="hidden" name="action" value="login">
               <input type="submit" class="bginput" value="  login!  ">
             
              
            </td>
          </tr>
        </form>
      </table>
    </div>


    <p align=center><font size=3>

    <br><br>
    <!-- navagation buttons -->
    <button style="width:50;height:30"
    onClick="history.go(-1)"><b>Back</b></button>

    <!-- Set the path to your favorite homepage here. -->
    <button style="width:50;height:30"
    onClick="window.location='http://www.YOURSITE.com/forums/'"><b>Home</b></button>

    <!-- Close button -->
    <button style="width:50;height:30"
    onClick="window.close()"><b>Close</b></button>
    <br><br><br><a href="http://www.YOURSITE.com/">Disclaimer</a><br>
    </p>
    </body>
    </html>
    filelogin.php
    PHP Code:
    <?php
    /*
    Created by FXRider 2003. 
    The below files are part of this application and called in that order.
    Files included: filepage.php filelogin.php filepage2.php fileprotect.php
    */
    error_reporting(7);
    header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");                // Date in the past
    //header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");     // always modified
    header("Cache-Control: no-store, no-cache, must-revalidate, private");  // HTTP/1.1
    header("Cache-Control: post-check=0, pre-check=0"false);
    header("Pragma: no-cache");                                      // HTTP/1.0


    include("./global.php");                         // include vB globals


    if ($HTTP_GET_VARS['HTTP_POST_VARS']['action'] == $HTTP_POST_VARS['action']) { // check for passed variables
      
    unset($HTTP_POST_VARS['action']);
    }
    $HTTP_POST_VARS['action'] = trim($HTTP_POST_VARS['action']);            // trim


    $username $HTTP_POST_VARS['username'];                    // set user 

    /* ################################### login ################################### */
    // snipit from vB code    

    if ($action=="login") {                                // login the user

      
    if (isset($username)) {
        
    // get userid for given username
        
    if ($user=$DB_site->query_first("SELECT userid,username,password,cookieuser FROM user WHERE username='".addslashes(htmlspecialchars($username))."'")) {
          if (
    $user['password']!=md5($password)) {  // check password
          
            
    eval("standarderror(\"".gettemplate("error_wrongpassword")."\");");
            exit;
          }
          
    $userid=$user[userid];
        } else { 
    // invalid username entered
             
              
    eval("standarderror(\"".gettemplate("error_wrongusername")."\");");
              exit;
        }
      }
          
    //setcookie("FDattempts",5,time()+900);                            // set attempts cookie
          
    setcookie("FDusername",$username,time()+900);                        // username
          
    setcookie("FDpassword",$user['password'],time()+900);                    // password
          
    eval("standardredirect(\"".gettemplate("redirect_login")."\",\"filepage2.php\");");    // next page

    }

    ?>
    filepage2.php
    PHP Code:
    <?php
    /*
    Created by FXRider 2003. 
    The below files are part of this application and called in that order.
    Files included: filepage.php filelogin.php filepage2.php fileprotect.php
    */
    error_reporting(7);
    header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");                   // Date in the past
    header("Last-Modified: " gmdate("D, d M Y H:i:s") . " GMT");             // always modified
    header("Cache-Control: no-store, no-cache, must-revalidate, private");      // HTTP/1.1
    header("Cache-Control: post-check=0, pre-check=0"false);
    header("Pragma: no-cache");                                          // HTTP/1.0

    include("./global.php");                             // vB globals

      
    $username $_COOKIE["bbuserid"];                        // get user that logged in

    if ($HTTP_GET_VARS['HTTP_POST_VARS']['action'] == $HTTP_POST_VARS['action']) {    //  passed args
          
    unset($HTTP_POST_VARS['action']);
    }

                                            
    // verify user of page valid
    $HTTP_POST_VARS['action'] = trim($HTTP_POST_VARS['action']);

      if (
    $user=$DB_site->query_first("SELECT userid,username,password,cookieuser FROM user WHERE userid='".addslashes(htmlspecialchars($username))."'")) {
          
      }
      else {
      
          exit;
      }
      
      if( 
    $_COOKIE["FDusername"] != $user['username']) {
       
          exit;
      }    
      if( 
    $_COOKIE["bbpassword"] != $_COOKIE["FDpassword"]) {
      
          exit;    
      }
      
    //setcookie("FDattempts",5);                                    // reset attempts counter


    $hiddenfiledir "/usr/local/customer/virtualfp/www.YOURSITE.com/forums/Path_to_PROTECTED_FILE_FOLDER/" ;    // files folder path to hide     

    // Files list. You add new file to the available files list here
    $a = array ( 'SOMEFILE1.zip''SOMEFILE2.zip');

    // the number of downloads for each file. Have as many elements as there are files.
    $count = array(1,2);

    // the file size of each file. Have as many elements as there are files.
    $filelen = array(1,2);

    // this loop collects the file size for each file and the number of time each file was downloaded.
    $i 1;
    foreach (
    $a as $v) {
        if(
    $numpost=$DB_site->query_first("SELECT COUNT(*) AS threads FROM file_stats WHERE file_name='".addslashes($v)."' ") ){
        
    $count[$i]=$numpost['threads']; // number of times downloaded calculated by number of recodes in tracking table
        
    $hiddenfilepath $hiddenfiledir $v ;        // create complete path name to file
        
    $filelen[$i] = filesize($hiddenfilepath)/1000;    // Gewt file length and convet to KBytes
        
    } else {                        
        
    $filelen[$i] = 0;                    // else set file size to zero    
        
    $count[$i]=0;                    // else set num times DL'd to zero
        
    }
       
    $i++;                         // increment array element
       //print "Current value of \$i: $i.\n";        // debug
    }                            // end for loop


    ?>

    <html>
    <head>
    <!-- insert your title here -->
    <title>YOURSITE.com Filz Page</title>
    </head>
    <!-- Background white, links black (unvisited), navy (visited), red (click)(active) -->
    <body bgcolor="#8484FF" text="#ffffff" link="#8484FF"
     vlink="#000000" alink="#ff0000">
    <table border="0" cellpadding="0" cellspacing="0" width="90%">
    <tr>
        <td width="10%">    <!-- Insert your favorite gif and URL here -->
            <A  align="left" HREF="http://www.SOMESITE.org/"><IMG SRC="http://www.YOURSITE.com/SOMELOGO.gif" ALT="[ Exercise your right to free speech! ]"></A>
        </td>
        <td width="90%" align="center">        
            <font size="6" color="000000" ><b>
            <! set the title on your page here -->
            YOURSITE.com Files Download Page<br></font><font size="5" color="#000000" >
            Use at your own Risk! For educational purposes only.
            </b></font>
            
        </td>    
    </tr>

    </table> 

    <p align=center><font size="4" >
    These files are for private downloading only.<br>DO NOT link to them! DO NOT share your password!</font><br><br><br>
    </font>
    <font color=darkblue>
    <!--     This is the file list table. Every avalable file needs an entry from <tr> to </tr> just like the rest
        This  can be made into a php foreach() loop and be more effieient most likely.
        You must insert the path to the Vb forums folder in each redirect URL -->

            
    <table border="1" cellpadding="5" cellspacing="1">
        <tbody align="center" style="color:#DCDBEA; background-color:#3B3E80">    
        <tr>        
                <td nowrap align=center> 
                
                    <!-- set url to vB forums folder here and for each element you add -->
                <b><u>FileLink</u><br>
                FileSize - Download Count</b>
                </td>
                <td nowrap align=center>
                
                <!-- add file description here -->
                <b>Description</b>
                </td>
                <td nowrap align=center>
                
                <!-- Add author of file here -->
                <b>Author</b>
                </td>                    
        </tr>
        </tbody>    
        <tbody align="center" style="color:black; background-color:#DCDBEA">    
        <tr>        
                <td nowrap align=center>            
                    <!-- set url to vB forums folder here and for each element you add -->
                <A HREF=http://www.YOURSITE.com/forums/fileprotect.php?hiddenfile=SOMEFILE1.zip>SOMEFILE1.zip</A>
                <br><?echo number_format($filelen[1])?>KB Downloaded <?echo $count[1]?> times.
                </td>
                <td nowrap align=center>            
                <!-- add file description here -->
                INSERT FILE DESCRIPTION
                </td>
                <td nowrap align=center>            
                <!-- Add author of file here -->
                INSERT AUTHOR
                </td>                        
        </tr>

        <tr>
                <td nowrap align=center>
                <A HREF=http://www.YOURSITE.com/forums/fileprotect.php?hiddenfile=SOMEFILE2.zip>SOMEFILE2.zip</A>
                <br><?echo number_format($filelen[2])?>KB Downloaded <?echo $count[2]?> times.
                </td>
                <td nowrap align=center>
                INSERT FILE DESCRIPTION
                </td>
                <td nowrap align=center>
                INSERT AUTHOR
                </td>                        
        </tr>
        

        </tbody>    
    </table>

    </font>

    <br>
    <br>

    </p>
    <p align=center><font size=3>

    <!-- navagation buttons -->
    <button style="width:50;height:30"
    onClick="history.go(-1)"><b>Back</b></button>
    <!-- set this to the homepage of your choice -->
    <button style="width:50;height:30"
    onClick="window.location='http://www.YOURSITE.com/forums/'"><b>Home</b></button>
    <!-- close button -->
    <button style="width:50;height:30"
    onClick="window.close()"><b>Close</b></button>

    </body>
    <br><br>
    <p>
    <center>

    <!-- set your disclaimer page here. -->
    <a href="http://www.YOURSITE.com/">Disclaimer</a><br>
    </center>
    </P>
    </html>
    fileprotect.php
    PHP Code:
    <?php 
    /*
    Created by FXRider 2003. 
    The below files are part of this application and called in that order.
    Files included: filepage.php filelogin.php filepage2.php fileprotect.php
    */
    error_reporting(7);
    header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");                // Date in the past
    header("Last-Modified: " gmdate("D, d M Y H:i:s") . " GMT");         // always modified
    header("Cache-Control: no-store, no-cache, must-revalidate, private");  // HTTP/1.1
    header("Cache-Control: post-check=0, pre-check=0"false);
    header("Pragma: no-cache");                                      // HTTP/1.0
    //header("Content-type: application/octet-stream");
    //header("Content-Disposition: attachment; filename=$hiddenfile");
    header("Content-transfer-encoding: binary\n");                // force binary TX

    if (strstr($_SERVER["HTTP_USER_AGENT"], "MSIE"))            // fix bug to force DL dialog
    header("Content-Disposition: filename=$hiddenfile"%20");            // For IE
    else
     
    header("Content-Disposition: attachment; filename=$hiddenfile");       // For Other browsers
    if(stristr($HTTP_SERVER_VARS["HTTP_USER_AGENT"],"Gecko"))           // check for browser
        
    header("Content-type: application/x-zip-compressed\n");        // for mozilla
    else
        
    header("Content-type: application/force-download");        // for other browsers
        
    $hiddenfiledir "/usr/local/customer/virtualfp/www.YOURSITE.com/forums/Path_to_PROTECTED_FILE_FOLDER/" ;    // files folder path to hide     
    $hiddenfilepath $hiddenfiledir $hiddenfile ;            // create path to file
    header("Content-Length: " filesize($hiddenfilepath));            // get and send filesize

    include("./global.php");                         // include vBulliten globals

    $Cuserid $_COOKIE["bbuserid"];                    // check files login cookie
      
      // get VB user info 
      
    if ($user=$DB_site->query_first("SELECT userid,username,password,cookieuser FROM user WHERE userid='".addslashes(htmlspecialchars($Cuserid))."'")) {
          
    /*if($_COOKIE["FDattempts"] == 0) {        // logic for max attempts to download
              setcookie("FDusername","");
                  setcookie("FDpassword",""); 
              print "Maximum download attempts exceeded!";
              exit;
          }*/
      
    }
      else { 
          exit;                               
    // if get failed, leave
      
    }

      if( 
    $_COOKIE["FDusername"] != $user['username']) {            // if file login page cookie     
                                          // don't match database name leave     
          
    exit;
      }    
      if( 
    $_COOKIE["bbpassword"] != $_COOKIE["FDpassword"]) {        // if VB
         
          
    exit;    
      }
      
      
    // $tries = $_COOKIE["FDattempts"] - 1;    // counter for max downloads per sesion
      // setcookie("FDattempts",$tries  );

    // log download attempt...more stats to come, perhaps move this to the top and log failed IP's 
    $DB_site->query("INSERT INTO file_stats (file_name,accessor,access_time) values('".addslashes($hiddenfile)."', '".addslashes($user['username'])."', '".time()."') ");
                                  
     
      
          
    $fp fopen($hiddenfilepath'r');    // stream the file
          
    fpassthru($fp);                 // no fclose required, fpassthru auto closes on completion
         

    ?>
    Last edited by FXRider; Mon 3rd Feb '03, 4:20pm.

  • #2
    There actually was a mod like this.
    Are there any bugs known?

    Comment


    • #3
      None reported bugs

      We have it live and no complaints.

      Comment


      • #4
        The project has been open sourced.

        fileprotect project page

        Comment

        widgetinstance 262 (Related Topics) skipped due to lack of content & hide_module_if_empty option.
        Working...
        X