允许 PHP 脚本访问文件夹中的 PDF - 但阻止直接 URL 引用

2023-12-03

在使用 CPanel 的 godaddy 托管网站上,我有一个小型 PHP 脚本,用于显示服务器上文本文件中的每一行。每行都包含一个指向 PDF 的私有 href 链接,只有登录用户才能看到。这些链接指向服务器上同一文件夹中的各种 PDF。该代码运行良好,我可以单击链接并查看每个 PDF。

问题是每个 PDF 也可以通过使用直接 URL 查询(即 website/folder/pdfname.pdf)来查看。由于这些是私人 PDF,我不希望它们公开。我尝试将文件夹的 CPanel 权限更改为“所有者” - 但这似乎也阻止了 PHP 脚本打开 PDF。

有没有办法允许 PHP 脚本访问文件夹中的 PDF - 但阻止直接 URL 引用?

注意:我不太擅长 PHP 或 CPanel - 抱歉。

Code...

$fname = "PDF-" . $user_name.".txt";
$fnum = fopen($fname,"r");
echo "<tr>";
While (($str = fgets($fnum)) !==  false) {
    $arr = explode("|",$str);   
    for ($x  = 0 ;  $x < count($arr);  $x++) {
        echo "<td>$arr[$x]</td>";
    }
    echo "</tr>";   
}
echo "</tr>";
fclose($fnum);

文件内容...

Xyz Company|21 Jan 2018|<a href="http://website.com"> website link</a>
Xyz Company|21 Jan 2018|<a href="http://website.com"> website link</a>
Xyz Company|21 Jan 2018|<a href="http://website.com"> website link</a>
Xyz Company|21 Jan 2018|<a href="http://website.com"> website link</a>*

除了从根目录删除文件之外,如果您正在运行 apache,您还可以更改.htaccess (我确信基于 Windows 的系统有一个web.config相等的)禁止直接访问某些文件。如果您将此代码片段添加到该文件中,它将拒绝带有以下内容的文件.pdf扩大:

<FilesMatch "\.(pdf)$">
Order Allow,Deny
Deny from all
</FilesMatch>

从那里,在您的应用程序内部,您可以创建某种系统来管理 PDF 链接,因此,如果您将真实路径存储在数据库中并使用 id 作为链接,类似于:

http://www.example.com/?file=1

或者如果您只是进行简单的扫描:

<?php
# The folder that the PDFs are in
$dir = __DIR__.'/website/folder/';
# Loop over a scan of the directory (you can also use glob() here)
foreach(scandir($dir) as $file):
    # If file, create a link
    if(is_file($dir.$file)): ?>
<a href="?action=download&file=<?php echo $file ?>"><?php echo $file ?></a>
<?php
    endif;
endforeach;

然后,如果用户尝试使用链接下载,您将检查他们是否首先登录,如果是,则在将其他任何内容输出到浏览器之前,通过执行如下脚本来下载文件(包括空格):

<?php
session_start();
# First check that the user is logged in
if(empty($_SESSION['username']))
    die('You must be logged in to download this document.');
# Not sure which directory you are currently in, so I will assume root
# I would do basename() here incase the user tries to add in something like:
# ../index.php and tries to download files they are not supposed to
$file = __DIR__.'/website/folder/'.basename($_GET['file']);
if(!is_file($file))
    die('File does not exist.');
# Double check that the file is a pdf
elseif(strtolower(pathinfo($file, PATHINFO_EXTENSION)) != 'pdf')
    die('File appears to be invalid.');
# Start download headers
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'.basename($file).'"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
readfile($file);
exit;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

允许 PHP 脚本访问文件夹中的 PDF - 但阻止直接 URL 引用 的相关文章

  • 使用 ImageMagick (PHP) 将 2 个图像并排合并为 1 个图像

    我认为这是一件容易的事 我有 2 张图片 JPG 我希望它们合并成一张图片 其中 2 张图片并排 所以我有图片 A 和图片 B 我想要图片 AB 并排 两个图像具有相同的宽度和高度 在本例中 宽度 200px 高度 300px 但是第二个图
  • 通过 Sparkpost 发送 iCal 邀请

    我正在尝试使用 SparkPost 通过电子邮件以附件形式发送日历邀请 但收到电子邮件后邀请不会打开 我使用两个文件 calendarinvite php 来创建邀请 使用 Sendemail php 来发送电子邮件 calendarinv
  • 所有 PHP 相等比较都是对称的吗?

    Is a b总是等价于 b a 我认为在 JavaScript 中 由于强制转换 有一些奇怪的情况并非如此 I think ide https stackoverflow com questions 4752579 are all php
  • 更改 Woocommerce 中“我的帐户”页面上的标题

    我见过大量有关如何使用 WooCommerce 我的帐户仪表板重新排序 更改导航和页面的示例 但我一生都无法弄清楚如何更改每个部分的主要标题 我的帐户 订单 下载 地址等 我已经搜索过模板 但没有任何乐趣 我尝试使用条件 php 注释来回显
  • 正则表达式上的换行符

    我试图替换两个标签之间的所有内容 但我无法构建正确的表达式 这就是我所做的
  • Ajax 没有将我重定向到下一页

    我正在尝试将单击的图像的 ID 传递到下一页 当我开发代码时 它没有将我重定向到下一页 当我单击 F12 并检查网络中的 POST 时 它显示变量已正确传递到下一页 如附图所示 但它没有将我重定向到下一页 所以现在我知道变量在下一页中正确传
  • 简单的 PHP 回显代码不起作用

    这是我的 html 和 php 脚本 h1 Bob s Auto Parts h1 table width 100 tr tr table 为什么这个输出会出现一个 gt 我希望它是 这有效 仅有的 这是输出 鲍勃的汽车零件 鲍勃
  • get url 重定向时 File_get_contents() 不起作用

    我正在使用的功能是 function http post url data data url http build query data data len strlen data url date default timezone set
  • CodeIgniter 控制器 - JSON - AJAX

    我正在尝试通过 AJAX 使用 CodeIgniter 发送表单构建 并尝试使用 JSON 获取响应 但是 我只在打开开发人员选项卡时看到响应 我什至不确定这是否实际上是响应 因为它显示了两个 json 数据 它所显示的只是加载旋转器 然后
  • 在 PHP 中比较两个对象的最快方法是什么?

    假设我有一个对象 在本例中为 User 对象 并且我希望能够使用单独的类来跟踪更改 用户对象不必以任何方式改变它的行为才能发生这种情况 因此 我的单独的类创建它的 干净 副本 将其存储在本地某个位置 然后可以将 User 对象与原始版本进行
  • 在 Flash Player 10 中打开 pdf

    我需要在 Flash Player 10 中打开 PDF 该 swf 不会在浏览器中运行 并且系统上不会有 adobe reader 程序 我需要知道是否可以在 Flash 播放器中打开 PDF 而无需以任何方式进行转换 我在谷歌上搜索了无
  • 检查 PHP 中的字符串长度

    我有一个长度为 141 个字符的字符串 使用下面的代码我有一个if如果字符串大于或小于 140 则语句返回一条消息 libxml use internal errors TRUE dom new DOMDocument dom gt loa
  • 重写 URL,将 ID 替换为查询字符串中的标题

    我对 mod rewrite 很陌生 但我做了一些搜索 但找不到这个问题的答案 我有一个网站 它只有一个 PHP 页面 根据查询字符串中传递给它的 ID 提供数十页内容 我想重写 URL 以便此 ID消失并替换为从数据库中提取的页面标题 例
  • PHP 扩展开发入门 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 请推荐有关 PHP 低 级 modules 编程接口的帮助文章或教程 搜索我的书签 我发现的唯一链接是
  • 如何在 phalcon 框架中同时连接多个数据库在模型类中同时使用两个而不仅仅是一个

    在我的代码中我有两个数据库ABC and XYZ 我想在同一模型中使用两个数据库 而不是 phalcon 中的解决方案是什么 如何为此实现多个数据库连接 one
  • 如何删除文件

    我们有一个脚本 scripts ourscript php和一个文件 media movie1 flv 当我们运行时 我们如何删除这个文件ourscript php Using unlink http php net manual en f
  • 从所有会话中注销

    我有一个注销选项 这是我的代码 session start session destroy setcookie key time 60 60 24 setcookie username time 60 60 24 我想添加另一个选项来注销所
  • ZF3/2 - 如何捕获 EVENT_DISPATCH 侦听器中引发的异常?

    有什么方法可以在 EVENT DISPATCH 监听器中抛出异常吗 class Module public function onBootstrap EventInterface event application event gt get
  • 使用 PHP 将 latin1_swedish_ci 转换为 utf8

    我有一个数据库 里面充满了类似的值 Dhaka 应该是 Dhaka 因为我在创建数据库时没有指定排序规则 现在我想修复它 我无法从最初获取数据的地方再次获取数据 所以我在想是否可以在 php 脚本中获取数据并将其转换为正确的字符 我已将数据
  • 使用 crypt() 加密

    我目前正在做一个非常安全的登录系统 但我是 crypt 函数的新手 需要一些快速帮助 我在注册过程中使用 crypt 加密密码字符串并将其保存到数据库中 但是 我如何在登录过程中解密密钥 或者我应该怎么做 或者是否可以对提交的密码字符串进行

随机推荐

  • Android导入库

    在我的项目中 我需要使用外部库 该库包括 class文件 我已使用此库将文件夹添加到我的项目中属性 gt Java 构建路径 gt 库 gt 添加类文件夹 我可以毫无问题地编译项目 但是当我运行它时 我得到failed resolving
  • 使用 websocket 发送私人消息

    我们如何使用 Websockets 和 PHP 实现私人消息系统 客户端到客户端 据我了解 服务器广播消息 所有客户端都可以通过 connection onmessage 事件处理程序接收消息 我想知道是否有一种方法可以将消息仅发送给网络套
  • UWP DatagramSocket 多播

    我设法制作了一个简单的应用程序 可以从多播组发送和接收数据 如果我打开应用程序的 2 个实例 具有相同代码的 2 个不同的 sln 文件 我可以发送和接收数据 问题是 5秒后 如果我从Client001发送消息 只有Client001会收到
  • 什么时候可以将日期时间存储为本地时间而不是 UTC?

    这是一个类似于this one 我真的很想在我的应用程序中将日期时间存储为本地时间而不是 UTC 这被认为是最佳实践 在应用程序中 我发生了许多事件 每个事件都分配给给定的位置 当我向用户显示它们时 我总是想显示local活动时间 IE E
  • 在 ruamel 中往返时按原样保留多行字符串

    假设我有一个像这样的文件 test long This is a sample text across two lines 当我加载文件并将其转储回来而不对文件进行任何更改时 它会将此文档更改为 test long This is a sa
  • Swift TableView 转至新的 ViewController,但索引路径错误(倒数第二个选择)

    我有一个奇怪的问题 我有两个 TableView 一个用于显示项目 另一个用于显示所有团队成员 对于两个 TableView 我都有相同的错误 当用户单击项目 团队成员时 我想显示其详细信息 奇怪的是 当运行应用程序并且我第一次选择项目 团
  • 在 Xcode 的 Foundation 代码示例中遇到“cleanup:”。这是什么?

    所以在即将推出的一些示例代码中核心有声读物我遇到了一个陌生的符号 cleanup 它在调用某些 dispose myStuff 函数之前使用 它前面没有 或 似乎你可以输入任何单词 后跟一个冒号 它就会像注释一样 int main int
  • 将字符串转换为特定的日期时间格式

    我已经在谷歌上搜索了一段时间 但我似乎无法找到解决方案 我认为这很容易 但它花了太长时间 我转向 stackoverflow 我需要将包含日期和时间的字符串转换为 DateTime 变量 我已将字符串格式化为我想要存储的确切格式 但是当我将
  • 任何避免警告 C6386 的方法,而不完全禁用它或代码分析

    默认情况下 Visual Studio 2019 开始将代码分析警告显示为编辑器内的绿色波浪线 这些对于学习 C 编程的学生来说可能非常有用 因为他们可以捕获经典错误 例如通过一个数组访问 不幸的是 误报可能会完全破坏学习体验 我担心我将不
  • 删除 Spark 字符串列的第一个字符

    我想知道正如我在标题中所说 对于以下两种情况 如何删除 Spark 字符串列的第一个字符 val myDF1 Seq 14326 1258634 15626 163262 toDF A val myDF2 Seq a14326 c12586
  • 用于查找未使用的包含标头的工具? [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 I know PC Lint可以告诉您有关包含但未使用的标头的信息 有没有其他工具可以做到这一点 最好是在 Linux 上 我们有一个庞大的代码库 在过去 15 年里 大量的功能发生
  • JSON 规范以及 BOM/charset-encoding 的使用

    我一直在阅读RFC 4627规范 我得出了解释 当将有效负载广告为application json哑剧类型 there MUST be no BOMs 位于正确编码的 JSON 流的开头 基于 3 编码 部分 以及 不支持媒体参数 因此 m
  • 保持 Promise 链的可读性

    我已经习惯了承诺链接数组 当每个承诺都是一行长时 读取承诺链非常容易 例如 myArray map x gt convertX filter whatever etc 这非常容易阅读 然而 当我使用自定义函数创建承诺链时 它会变得更加混乱
  • 将包含数组的字符串转换为实际数组[重复]

    这个问题在这里已经有答案了 我不知道为什么我在这件事上遇到这么多麻烦 这看起来应该很简单 我有一个如下所示的 JavaScript 字符串 var str 1 2 3 4 5 6 7 8 9 我实际上想将其转换为数组的数组 str spli
  • 使用 SQL 脚本创建用户、映射到数据库并为该数据库分配角色

    我以前做过这个 但不是通过脚本 我必须在 SQL Server 中创建一个新用户 SQL 身份验证 并将用户映射到数据库 并使用 SQL 脚本将用户的角色分配给该数据库 我该怎么做 Try CREATE USER Username FOR
  • 通过 pip 安装 pygame

    我正在尝试在 python 2 7 中安装 pygame 我在这个 python 中执行此操作 因为出于某种原因 如果我尝试在 python 3 7 中安装 pip 它将无法工作 从我输入的终端 sudo pip install pygam
  • 页面中存在多个表单或多个提交?

    我正在创建一个页面 其中包含网站上销售的产品 我想在每个产品附近添加一个 添加到购物车 按钮 其中列出的标记与此类似 h4 class productHeading Product Name 1 h4 div Extra informati
  • 登录错误:登录此应用程序时出现错误。请稍后再试

    我收到这个错误 当我尝试使用 Facebook 登录我的应用程序时 当我第一次验证时它会正常工作 在我卸载我的应用程序并现在尝试使用 Facebook 登录后 我收到此错误 另一个问题 在 device1 中进行身份验证并尝试在 devic
  • ejbFacade 为空

    我从 jsf 页面 overzichtAlleGroepen xhtml 调用 ManagedBean OverzichtAlle java 但是当我进入此页面时 我收到错误消息can t instantiate Managed Beans
  • 允许 PHP 脚本访问文件夹中的 PDF - 但阻止直接 URL 引用

    在使用 CPanel 的 godaddy 托管网站上 我有一个小型 PHP 脚本 用于显示服务器上文本文件中的每一行 每行都包含一个指向 PDF 的私有 href 链接 只有登录用户才能看到 这些链接指向服务器上同一文件夹中的各种 PDF