我想保护pdf文件不被直接链接,而是让我登录的用户能够访问它。我有一个链接,目前转到一个javascript函数发布一个表单: $( 'nameofdoc')的setProperty( '价值',DOC)。 的document.getElementById( 'sendme')提交();
其中sendme是表单的名称,doc的名称是我想要显示的文档的索引。
然后转到php文件:
$docpath = $holdingArray[0].$holdingArray[1];
$file = $holdingArray[0]; //file name
$filename = $holdingArray[1]; //path to the file]
header( 'Location:'.$docpath ) ;
header('Content-type: application/pdf');
header('Content-Disposition: attachment; filename="'.$filename . '"');
readfile($filename)
这一切都很好,它加载文件并输出pdf。我不能做的是保护目录免受直接链接 - 即www.mydomain.com/pathToPdf/pdfname.pdf
我曾经想过使用.htaccess来保护目录,但是它位于共享主机上,所以我不确定安全性,无论如何,当我尝试过时,我无法让它工作。
任何帮助都会很棒,因为这是我尝试修复此问题的第四天。
感谢
更新
我得到了很多帮助,谢谢你,但我还没到那里。
我有一个.htaccess文件,当从目录中请求pdf时,它现在启动另一个php文件:
RewriteEngine on
RewriteRule ^(.*).(pdf)$ fileopen.php
当fileopen.php文件启动时,无法打开pdf
$path = $_SERVER['REQUEST_URI'];
$paths = explode('/', $path);
$lastIndex = count($paths) - 1;
$fileName = $paths[$lastIndex];
$file = basename($path);
$filepath = $path;
if (file_exists($file)) {
header( 'Location: http://www.mydomain.com'.$path ) ;
header("Content-type: application/pdf");
header("Content-Disposition: attachment; filename=".$file);
readfile($filepath);
}else{
echo "file not found using path ".$path." and file is ".$file;
}
输出是 使用路径/documents/6/Doc1.pdf找不到文件,文件是Doc1.pdf
但该文件确实存在且处于该目标中 - 任何想法?
好的我很高兴地报道Jaroslav确实帮我理清了这个问题。他的方法运行良好,但是将所有目录内容排成一行很棘手。最后,我花了几个小时玩组合来使它工作,但他给出的原则很好。感谢
答案 0 :(得分:6)
最好的方法是使用htaccess保护该文件夹,如您所述。所以你把所有的PDF放在pdf /文件夹中,并在同一个pdf文件夹中输出.htaccess文件:
RewriteEngine on
RewriteRule .* your-php-script.php
现在此文件夹中的url无法访问任何文件。对此文件夹中每个文件的每个请求都将返回your-php-script.php脚本返回的内容。在你的-php-script.php中,你可以这样做:
//Check if user has right to access the file. If no, show access denied and exit the script.
$path = $_SERVER['REQUEST_URI'];
$paths = explode('/', path);
$lastIndex = count($paths) - 1;
$fileName = $paths[$lastIndex]; // Maybe add some code to detect subfolder if you have them
// Check if that file exists, if no show some error message
// Output headers here
readfile($filename);
现在,如果用户打开domain.com/pdf/nsa-secrets.pdf,Apache将运行你的-php-script.php。脚本将变量$ _SERVER ['REQUEST_URI']设置为“domain.com/pdf/nsa-secrets.pdf”。你取最后一部分(文件名)并将其输出给用户(或不是)。
这将阻止任何人通过知道URL直接从互联网访问文件。如果有人可以直接访问您服务器上的文件,那么这不会阻止他们。另一方面,我认为任何共享主机都会阻止用户获取其他客户端的文件。唯一的方法是以某种方式破解服务器。但后来我们变得非常偏执,如果这可能是你的情况,你不应该首先使用共享主机。
如果你无法使htaccess工作,你可以尝试模糊文件,因此很难为外面的人发现它们。例如,将文件从mySecretData.pdf更改为djjsdmdkjeksm.pdf。这可能会有所帮助。
答案 1 :(得分:1)
我想保护pdf文件不被直接链接,而是让我登录的用户能够访问它。
检查以确保在流式传输PDF内容之前有经过身份验证的用户。
答案 2 :(得分:0)
这有点草率但可以假设您可以设置MYSQL数据库。它允许您将URL中的“密码”作为MD5字符串或明文传递(如果需要)。尝试在不使用htaccess或现有框架工作的情况下设置某种安全性有点笨重。然而,这甚至不会将文件附加到流,直到它知道你已经“认证”我认为如果你设置一个在本地保存cookie然后你不需要的登录页面,你可以做得更好一些。传递URL中的“密码”。
$file = $_GET['file'];
$pass = $_GET['pass'];
$download_folder = '../Protected';
$file = basename($file);
$filepath = "$download_folder/$file";
if (file_exists($filepath)) {
if(CheckUser($pass)){
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=$file");
session_write_close();
readfile($filepath);
} else {
echo 'Not Authenticated!';
}
} else {
echo 'No File!';
}
function CheckUser($value){
$con = mysqli_connect("test.com","test","123456","my_db");
// Check connection
if (mysqli_connect_errno()){
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
$result = mysqli_query($con,"SELECT user FROM pass_table WHERE password =".md5($value).";");
while($row = mysqli_fetch_array($result)){
mysqli_close($con);
//return $row['user'];
if($row['user']){
return true;
}
}
mysqli_close($con);
return false;
}