php - 为未登录用户保护 .PDF 和 .JPG
问题描述
我想在文件夹中建立一个包含受保护数据的网站。我在我的 PHP 中有一个会话检查,仅在登录时显示数据。
数据是一对 .PDF 和 .JPG 文件。
但是,当 nog 登录用户完整的 url 搜索时,他可以找到并打开文件。示例:www.domain.com/protected-data/file.pdf
我该如何保护这个?
我已经用 .htaccess 做了一些技巧。
Order Allow,Deny
Allow from all
<Files ~ "\.(gif|jpg|png|pdf)$">
Deny from all
</Files>
但是即使用户登录,这个脚本也会拒绝我的所有文件。
解决方案
这个想法是将您的文件放在外部无法获得的目录中。假设您有以下目录结构:
|_src
\_.htaccess
|_private
\_.htaccess
|_public
\_read.php
src/:包含你的类,源代码。
private/:包含您的 JPG 和 PDF 文件。
public/:包含您的前端控制器,这是互联网上唯一可用的直接方式。
src/.htaccess
# No one should be able to access your source code from Internet
Deny from All
私人/.htaccess
# No one should be able to access your private files from Internet
Deny from All
这样做只能从 Internet 访问public/目录。在您的public/目录中,您可能有一个读取这些文件的 PHP 文件。这是一个小例子。
公共/read.php
<?php
session_start();
//if the user is logged, read the file and echo it
if (1 === $_SESSION['logged']) {
//Filename to read could be given like ?file=invoice.pdf
$file = $_GET['file'];
//Warning: you should sanitize the $file to prevent an attacker to give a file like "../src/yourclass.php".
echo file_get_contents(__DIR__.'/../private/'$file);
}
请参阅有关Deny的Apache 文档。
推荐阅读
- node.js - 如何在 iis 10 上设置节点项目
- c# - 在 C# ASP.Net Razor Pages 中将表数据显示为列表的最佳方式
- powershell - 使用 AutoHotKey 和 Windows 终端通过“-Command”参数将参数传递给 PowerShell
- node.js - mongoose find 不返回任何文档,而 compass 则
- apache-spark - 如何将列的值与 Spark 上单独数据帧上列的所有行进行比较
- ios - 是否可以从另一个 UINavigationController 呈现 UINavigationController?
- java - java.lang.NullPointerException:尝试在空对象引用 Retrofit 上调用虚拟方法
- python - 如何在不使用计数的情况下在列表列表中查找非重复列表的索引?
- javascript - 数据表导出没有过滤器中的所有列值
- python - Matplotlib 在 ginput() 期间绘制图形