我有一个名为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的专家,所以解释尽可能多的努力。谢谢
答案 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');
}
?>