阻止来自直接URL的访问,但不阻止来自mysql数据库中的用户

时间:2014-03-24 04:27:13

标签: php mysql .htaccess directory

我有一个名为users的数据库,其中一个名为users的表包含用户/通行证/电子邮件,供人们访问我的网站。该网站的目的是让音乐家彼此分享他们的音乐和/或录制的表演。我想限制除db / table中的用户之外的所有文件访问。

我在www目录之外有.mp3文件。我目前正在使用这个:

<?php
header('Content-Type: mp3');
readfile("../Music/" . $_GET['mp3']);
?>

致电:

<a href="music.php?mp3=songnamehere">Song name here</a>

但是,如果你知道直接链接,你可以下载它没有任何权限。

example.com/music.php?mp3=songnamehere

我试图用.htaccess来解决这个问题,但仍然可以通过直接网址访问:

# secure htaccess file
<Files .htaccess>
order allow,deny
deny from all
</Files>

无济于事,我仍然无法上班。我需要一些适用于我的db / table的东西,它包含users / pass / email并阻止非用户访问url。

您可以提供的任何信息都将是一个很大的帮助。但是,我不是php的专家,所以解释尽可能多的努力。谢谢

2 个答案:

答案 0 :(得分:0)

我使用readfile()进行字符串散列以防止未经授权的URL访问。您可以使用文件名和用户ID作为散列的一部分,以确保单独使用url是不够的。我已经创建了一个简单的哈希过程来为您提供想法。希望这会有所帮助。

<强>更新 扩展以下代码以提供完整的工作示例

<?php
  //**************************************************************************
  // the following code should be placed with your login verification code, 
  // substituting the correct userid  or username
  //**************************************************************************
  if (!isset($_SESSION)) {
      session_start();
  }
  // you will have to set the userid from 
  $_SESSION['userid'] = "user3453965";
  //**************************************************************************
?>



<?php
  //**************************************************************************
  //The following code is in a separate php from the above - e.g. music.php
  //**************************************************************************
  if (!isset($_SESSION)) {
      session_start();
  }
?>

Music File to download:<br>
<a href="<?php echo $_SERVER['PHP_SELF'] . "?file=" . urlencode("16 Bit - Twice.mp3") ?>">16 Bit - Twice.mp3</a><br>
<a href="<?php echo $_SERVER['PHP_SELF'] . "?file=" . urlencode("test.mp3") ?>">test.mp3</a><br>


<?php
  if (isset($_GET['file'])){
      // a file is chosen to download
      $file = urldecode($_GET['file']);
      if (file_exists($file)){  
        if (isset($_SESSION['userid'])){
          //****************************
          // check that the userid is valid
          //****************************
          if (valid_user($_SESSION['userid'])){
            $userid = $_SESSION['userid'];
            // generates a hash to validate the request
            $hash = gethash($file, $userid);
            downloadfile($file, $hash, $userid);
          }
        }
      }
      else{
        echo "<br>File not found: $file<br>";
      }
  }

  function valid_user($userid){
      // check that the userid if valid = e.g. call to database or however you want
      // I am using an array for this example so it can be stand alone
      $valid_users = array("henry mcmuffin", "user3453965");
      if (array_search($userid, $valid_users)){
        return true;
      }
      return false;
  }

  function gethash($string, $userid){
      // use your own method of hashing here
      // you can pass the user id and make this part of the returned string
      return md5($string . $userid);
  }


  function downloadfile($file, $hash, $userid, $outfilename=""){
      if (!isset($_SESSION)) {
          session_start();
      }

      // prevent url hacking
      // define gethash() to hash the filename
      $hash2 = gethash($file, $userid);

      // if hash correct 
      if ($hash == $hash2) {

          // File Exists?
          if (file_exists($file)){
              // Parse Info / Get Extension
              $fsize = filesize($file);
              $path_parts = pathinfo($file);
              $ext = strtolower($path_parts["extension"]);

              // Determine Content Type
              switch ($ext) {
                  case "mp3": $ctype="audio/mpeg"; break;
                  case "pdf": $ctype="application/pdf"; break;
                  case "gif": $ctype="image/gif"; break;
                  case "png": $ctype="image/png"; break;
                  case "jpeg":
                  case "jpg": $ctype="image/jpg"; break;
                  default: $ctype="application/force-download";
              }

              header("Pragma: public"); // required
              header("Expires: 0");
              header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
              header("Cache-Control: private",false); // required for certain browsers
              header("Content-Type: $ctype");

              $outfilename = ($outfilename=="" ? basename($file) : $outfilename);
              // Download file
              header('Content-Disposition: attachment; filename='.basename($outfilename));

              header("Content-Transfer-Encoding: binary");
              header("Content-Length: ".$fsize);

              if (ob_get_length() > 0 ) {
                // clear the buffer to allow download
                ob_clean();
                flush();
              }
              readfile( $file );
          } 
          else {
              echo('File Not Found: ' . $file);
          }
      }
      else {
          echo ('Invalid file request');
      }
  } 
?>

答案 1 :(得分:0)

你可以使用会话 如果用户登录检查页面设置相同的变量,您的登录页面会添加类似这样的内容

<?php
session_start();
$_SESSION['login']='login';

?>

在你的music.php页面

<?php
session_start();
if(isset($_SESSION['login'])){
header('Content-Type: mp3');
readfile("../Music/" . $_GET['mp3']);
}
else{
header('Location: login.php');

}
?>