使用 PHP 保护文档

2024-01-09

我有一个简单的登录/访问控制系统来保护一些受限制的页面,但在这些页面内有一些需要保护的链接,即Word文档。因此,如果我将这些资源保留在 webroot 中,它们就可以通过 URL 访问。保护受限制页面内的这些资源的最佳方法是什么?我知道我可以用密码保护该文件夹,但用户会受到两次挑战,一次针对受限页面,另一次针对资源链接。有什么建议吗?


根据您的用例,您在这里有几个选项。

  1. 使用 PHP 提供文件服务。基本上,要么拦截 PHP 读取文件的所有尝试(使用 mod_rewrite 规则),要么直接链接到 PHP 并将文件放在文档根目录下。然后使用类似的东西fpassthru http://us.php.net/manual/en/function.fpassthru.php将文件发送到浏览器。请注意,您must正确设置内容类型标头。另请注意,这会占用大量服务器资源,因为服务器需要读取 PHP 中的整个文件并发送它,所以这很容易,但并不轻松。

    $f = fopen('file.doc', 'r');
    if (!$f) {
        //Tell User Can't Open File!
    }
    header('Content-Type: ...');
    header('Content-Length: '.filesize('file.doc'));
    fpassthru($f);
    die();
    

    这样做的主要好处是它简单且便携(适用于所有服务器)。但是您正在牺牲宝贵的服务器资源(因为当 PHP 提供文件服务时,它无法提供其他页面)以换取这种好处......

  2. 使用网络服务器发送文件,类似于X-SendFile http://blog.lighttpd.net/articles/2006/07/02/x-sendfile(Lighttpd),X-SendFile https://tn123.org/mod_xsendfile/(Apache2/2.2) 或X-Accel-Redirect http://wiki.nginx.org/XSendfile(NginX)。因此,您可以将对文件的所有请求重定向到 PHP(手动或重写)。在 PHP 中,您需要进行身份验证。您将发送 Content-Type 标头,然后发送类似的标头X-SendFile: /foo/file.doc。服务器实际上会发送文件,所以你不必这样做(它是far比从本地 PHP 发送更高效)。

    header('Content-Type: ...');
    header('X-SendFile: /foo/file.doc');
    die();
    

    这里的主要好处是您不需要从 PHP 提供文件。您仍然可以执行您想要的所有身份验证和日志记录,但在开始传输文件后立即释放 PHP。

  3. 使用类似的东西mod_secdownload http://redmine.lighttpd.net/wiki/1/Docs%3aModSecDownload(lighttpd)或mod_auth_token http://code.google.com/p/mod-auth-token/(阿帕奇)。基本上,当您生成文件的链接时,您会在 PHP 中创建一个令牌。该令牌是秘密密码的 MD5 与当前时间戳的组合。这样做的好处是 URL 仅在您在配置中指定的时间内有效(默认情况下为 60 秒)。因此,这意味着您给出的链接只会有效 60 秒,然后任何进一步尝试查看内容都会生成 400 系列错误(我不确定这是我的想法)。

    $filename = '/file.doc';
    $secret = 'your-configured-secret-string';
    $time = dechex(time());
    $token = md5($secret . $filename . $time);
    $url = "/downloads/$token/$time$filename";
    echo "<a href="$url">Click Here To Download</a>";
    

    这样做的主要好处是与实现相关的开销非常少。但您必须接受 URL 仅在设定时间内有效(默认为 60 秒)...

  4. 将其推送到 CDN 上进行处理。这类似于选项 #3(上面的选项),但使用 CDN 来处理文件服务而不是本地服务器。一些 CDN,例如EdgeCast http://www.edgecast.com/提供类似的功能,您可以设置一个令牌,该令牌在设定的时间后过期。如果您有的话,这个案例会很好用lot流量,并且可以证明 CDN 的费用是合理的。 (注意:与链接的 CDN 没有隶属关系,仅链接是因为我知道它们提供该功能)。

就我个人而言,我已经完成了上述所有操作。您的用例是什么确实很重要。如果您正在构建一个将安装在共享主机或您无法控制的多个不同服务器上的系统,请坚持使用第一个选项。如果您拥有完全控制权并且需要节省服务器资源,请执行其他两项之一。

Note:除了这三个之外还有其他选择。这些只是最容易实现的,大多数其他选项与这些选项足够相似,可以归入该类别......

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 PHP 保护文档 的相关文章

  • 如何在 Zend Framework 3 中注册自定义表单视图助手

    我正在将继承的 Zend Framework 2 应用程序迁移到 Zend Framework 3 并且在注册自定义表单视图助手时遇到了一些困难 这些助手在应用程序使用版本 2 时起作用 主要用于添加标签属性以实现可访问性 例如 这是一个自
  • 从 PHP 数组生成 HTML 表

    我不明白这一点 我需要解决看似简单的问题 但这超出了我的逻辑 我需要编写一个函数 table columns input cols 它将输出一个表 示例 input array apple orange monkey potato chee
  • 检查 $_POST 数据

    我正在对表单进行一些垃圾邮件检查 下面的代码在我的本地主机上正常工作 如果为 true 则重定向到 google com 但是 当它在生产服务器上时却不起作用 执行脚本的其余部分并且不重定向到 Google com if POST SERV
  • 如何从父类中获取子类名

    我试图在不需要子类上的函数的情况下完成此任务 这可能吗 我有一种感觉 但我真的很想确定
  • 为什么我的会话仍然存在?

    我一定很愚蠢 因为似乎一件相当明显的事情现在让我完全困惑 我有一个会议 ie SESSION handbag id 在某个时刻 我需要彻底终止这个会话 ie at the start of the page session start el
  • jQuery ajax 调用包含重音字符的 url 将错误的 Uri 从 IE 发送到服务器

    我在使用 IE 发送包含重音字符的 url 时遇到问题 这是一个简单的函数 function runjQueryTest var url test Beyonc get url function 在服务器 PHP 上我记录了请求uri的值
  • Yii2 - 错误请求 (#400) |前端和后端cookie

    仅当我打开时才会出现此问题frontend and backend在相同的browser 设想 与后端交互 gt 切换选项卡 gt 与前端交互 gt 切换选项卡返回 gt 与后端交互 gt 错误请求 400 Cookie 后端 identi
  • 如何使用 PHP 构建正确的 SOAP 请求

    我需要格式化 构建此 SOAP 服务 的请求 http api notificationmessaging com NMSOAP NotificationService wsdl http api notificationmessaging
  • 如何在 GitHub Action 中使用不同版本的 PHP 进行测试

    我有一些 PHP 代码 其中包含使用以下命令运行的测试PHPUnit并想对其进行测试GitHub Actions 我在他们的文档中找不到测试 PHP 包的方法 我想使用不同版本的 PHP 进行测试 但他们只有最新的版本7 3安装 您可以添加
  • PKCE 增强授权代码流中保护 code_verifier 的最佳实践

    由于 PKCE 现在是推荐的隐式流程授权方法 因此我正在寻找处理代码验证器的最佳实践以及如何完成此操作的建议 在高层 PKCE 授权流程中包括 产生code verifier在客户端 产生code challenge来自 1 hit aut
  • 如何将表中不存在但原始SQL中存在的实体字段设置为别名?

    假设我们有一个这样的查询 SELECT CUSTOM EXPRESSION as virtualfield FROM users 用户的实体本身具有 虚拟字段 但映射注释没有 因为表没有该字段 假设它作为原始 SQL 执行 我们如何使用上面
  • Facebook PHP-SDK 页面刷新后似乎丢失了 userID

    我似乎登录工作正常 我可以登录 接受应用程序 第一次 然后显示用户信息 例如姓名 图片 等 然而 当我刷新页面时 userid 又回到 0 我必须再次登录 我不确定问题是什么 我必须在每次页面加载时重新启动它还是什么 我不知道 我会发布一些
  • Nginx 502 网关错误。通过增加buffer来解决。为什么?

    我正在设置 LEMP 堆栈来运行 Drupal 我安装了 Nginx 和 PHP FastCGI Nginx 工作正常 但任何运行 PHP 的尝试都会出现错误 502 Bad Gateway 谷歌很快发现 nginx 502 错误网关 ht
  • PHP 编码风格回归;在开关/外壳中

    我们正在尝试为我们的团队实施新的编码风格指南 当未找到 break 时 php codeniffer 会在 switch case 语句上打印警告 如下所示 switch foo case 1 return 1 case 2 return
  • 如何使用更新资源控制器 laravel 4?

    我有带有索引 编辑 更新方法的客户控制器 Route resource customer CustomerController 控制器方法更新 public function update id echo id 我的 HTML 表单
  • 如何处理 REST api 中的 php 通知、警告和错误?

    在 REST API 中 200 响应表明操作成功 PHP 默认情况下直接在响应正文中输出错误消息 而不更改响应代码 在 SPA 中 用户无法直接看到响应文本 因此 当应用程序未按预期工作时 我通过 FireBug 检查响应正文 以检查可能
  • 使用PHP从doc、xls文件中读取数据

    我想知道是否可以从 doc 和 xls 文件中读取数据并将 将内容读取到图像文件中 创建文档的页面样本 例如 我有一些文件希望我的客户购买 所以我需要自动创建小图像 例如我的文档样本 我们将不胜感激您的帮助 对于读取 xls 文件 我真的推
  • 使用 Vue 的多模式组件

    我在 Vue 中实现动态模式组件时遇到问题 A common approach I follow to display a set of data fetched from the db is I dump each of the rows
  • 矩形超出边界是什么意思

    PPB Graphics2D PaintImageData 矩形超出界限是什么意思 我几乎在我检查的每一段代码中都看到了它 最新的代码是 define my consumer key define my consumer secret oa
  • PHP更改小数点分隔符

    在某些情况下 PHP 会在操作后更改小数点分隔符 下面是一个示例 为什么小数点分隔符变成 这是一个多语言网站 在西班牙语版本中 区域设置设置为西班牙语 es ES 小数点分隔符为 这就是为什么正在改变 解决方案是强制 LC NUMERIC

随机推荐

  • 如何解析和简化像“3cm/μs² + 4e-4 sqmiles/km/h**2”这样的字符串,正确处理物理单位?

    我想像这样分割一个字符串3cm s 4e 4 sqmiles km h 2进入其SI unit https en wikipedia org wiki International System of Units 在这种情况下 m s 2 及
  • fscanf() 仅拾取文件的第一行

    我有一个制表符分隔文件 我正在尝试将其转换为制表符分隔文件 我正在使用 C 我在尝试读取文件的第二行时遇到了困难 现在我只有数万行重复第一行 include
  • R 中的豪斯曼类型测试

    我一直在使用 plm 包的R进行面板数据分析 该软件包中用于选择 固定效应 或 随机效应 模型的重要测试之一称为豪斯曼型 Stata 也可进行类似的测试 这里的重点是Stata要求首先估计固定效应 然后再估计随机效应 但是 我在 plm 包
  • 如何在factory_bot中定义数组/哈希?

    我正在尝试编写一个测试来模拟 Dropbox 的 REST 服务的一些返回值 该服务以数组形式返回数据 并带有嵌套哈希 我无法弄清楚如何对我的工厂进行编码 因为返回结果是一个内部有 has 的数组 这里会放什么 Factory define
  • 如何在 Ruby 中使对象实例成为哈希键?

    我有一个带有一些成员变量的 Foo 类 当类的两个实例中的所有值都相等时 我希望对象 相等 然后我希望这些对象成为我的哈希中的键 当我当前尝试此操作时 哈希将每个实例视为不相等 h f1 Foo new a b f2 Foo new a b
  • 在景观中隐藏选项卡栏而不推送到 NavigationController

    我想在横向显示没有选项卡栏的另一个视图 所以我创建一个新视图 只更改self view and self hidesBottomBarWhenPushed YES 但这对我不起作用 希望有人能帮忙吗 只需将这一行添加到您的viewWillA
  • 在 Haskell 中使用递归查找列表中的出现次数

    我有一个列表 它只能包含两种元素 Apple and Peach 我需要创建一个函数 给定一个包含这些元素的列表 该函数返回出现的次数Apple通过使用递归在列表中 这是我的尝试 data Fruit Apple Peach findFru
  • 自动将 jupyter 笔记本转换为 .py

    我知道对此有一些疑问 但我还没有发现任何足够可靠的内容 目前我正在从终端使用一个创建 py 的命令 然后将它们移动到另一个文件夹 jupyter nbconvert to script folder notebooks notebook i
  • “图像视图”的位置和大小不明确

    我试图设置 UIImageView 在故事板中没有固定的大小和宽度 我将容器的前导空间设置为大于或等于 20 将容器的顶部空间设置为大于或等于 20 将容器的尾随空间设置为大于或等于 20 并将 UICollectionView 的垂直间距
  • 将用户/密码添加到 SOAPHeader 以使用 AXIS2 进行 WebService 客户端调用

    请帮助 我正在尝试从 SOAPUI 调用 WebService 我注意到该服务需要我通过请求参数提供的用户名和密码 我注意到原始 XML 包含添加到 SOAPHeader 中的用户 密码片段 片段如下
  • div 可以有多个类吗(Twitter Bootstrap)[重复]

    这个问题在这里已经有答案了 一个div标签可以有两个类吗 我正在使用 twitter bootstrap 并且我想使用两个预定义的类 一个是一个active我想在一个类上使用dropdown toggle在导航栏中 在 html 中解决这个
  • ASP.Net 会话超时:为什么默认使用 20 分钟?

    在 ASP Net 中 默认会话超时设置为 20 分钟 为什么这样 这背后有什么具体原因吗 不应将其设置为高于 20 分钟 特殊情况除外 因为每个打开的会话都会占用内存 From MSDN 站点上的 Session Timeout http
  • 我可以控制 RealityKit 中的 Reality Composer 行为吗?

    我想使用 SwiftUI 制作一个按钮 当按下按钮时 模型将隐藏 我已经阅读了此链接中的教程 创建触发器 https developer apple com documentation realitykit creating a trigg
  • OpenGLES 中的屏幕到世界坐标转换是一项简单的任务吗?

    iPhone 上的屏幕与世界问题e 我有一个在 EAGLView 中渲染的 3D 模型 CUBE 我希望能够检测到何时触摸立方体的给定面 从任何方向角度 的中心 听起来很容易 但事实并非如此 问题 如何准确地将屏幕坐标 触摸点 与世界坐标
  • JAVAFX / WebView / WebEngine FireBugLite 或其他一些调试器?

    我正在开发一个应用程序 需要在应用程序的 WebView WebEngine 部分运行调试器 以便我可以更好地调试我的应用程序 但我在互联网上找到的注入 Firebug Lite 的代码由于某种原因无法正常工作 如果我在 Firefox 控
  • 处理来自 IOS 设备的请求时发生异常

    我正在尝试在 iOS 设备上播放视频 当我尝试玩时出现以下错误 27 Apr 2015 06 59 30 GET media 2015 04 VID 20150327 112644 mp4 HTTP 1 1 200 18 Exception
  • 未在 Blazor 服务器端应用程序中创建本地化 Cookie

    我设置了本地化Startup cs services AddLocalization options gt options ResourcesPath Resources and var supportedCultures new en U
  • 将代码从 RestSharp 转换为 HttpClient

    有人可以帮我将这个使用 RestSharp 的 ASP Net Core 示例 在我的 Web Api 中使用以使用来自 Auth0 的管理 API 转换为使用 HttpClient 的示例吗 var client new RestClie
  • 如何在Python中运行并行程序

    我有一个 python 脚本来使用 os subprocess 模块运行一些外部命令 但其中一个步骤需要花费大量时间 因此我想单独运行它 我需要启动它们 检查它们是否完成 然后执行下一个不并行的命令 我的代码是这样的 nproc 24 fo
  • 使用 PHP 保护文档

    我有一个简单的登录 访问控制系统来保护一些受限制的页面 但在这些页面内有一些需要保护的链接 即Word文档 因此 如果我将这些资源保留在 webroot 中 它们就可以通过 URL 访问 保护受限制页面内的这些资源的最佳方法是什么 我知道我