使用 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 保护文档 的相关文章

  • 合并 url 中的 2 个输入值

    我有这样的形式
  • 如何在数据列表 HTML PHP 中设置选择

    您好我想知道是否有一种方法可以在数据列表中设置选定的值 我想要这样的东西
  • 使用“INSERT ... ON DUPLICATE KEY UPDATE”插入多条记录

    我的表结构 table marks 我的目标 我想用条件插入或更新多条记录 我目前正在通过此查询进行检查 第一步 SELECT FROM marks WHERE student 115 AND param 1 第二步 if records
  • MySQL 和 PHP 参数 1 作为资源

    好吧 当我运行下面提到的代码时 PHP 向我抛出此错误 在日志中 Error mysql num rows 期望参数 1 为资源 第 10 行 place 中给出的字符串 9 11号线 queryFP SELECT FROM db coun
  • 如何仅删除页面的自动段落格式,而不删除帖子的自动段落格式(WordPress)

    我已经熟悉这个在 WordPress 中删除自动段落格式的小技巧 remove filter the content wpautop remove filter the excerpt wpautop 但是添加这个函数 php删除整个网站的
  • file_get_contents 大文件上传

    我正在尝试使用 fsockopen 上传 2GB 以上的大文件 但 file get content 出现以下错误 我无法在内存中存储大文件 我需要分块发送数据 但不知道如何执行此操作 请问有人可以指导我吗 致命错误 允许的内存大小 134
  • 这个巨大的正则表达式是如何工作的?

    我最近在我的一个目录中的一个名为的文件中找到了下面的代码doc php 文件功能或链接到文件管理器 做得非常好 基本上 它列出了当前目录中的所有文件 并且允许您更改目录 它可以访问我的所有文件 添加 重命名 信息 删除 我不记得安装过它 我
  • 自定义帖子类型的 WordPress 自定义字段

    过去有几个人出现过这个问题 但他们的问题的解决方案对我来说不起作用 我已经尝试了很多 在 WordPress 中 我创建了 3 种自定义帖子类型 1 代表 视频 新闻 和 音乐 每个内容都发布到自己的页面 我想添加自定义字段 这样我就可以为
  • php基于onclick函数输入日期类型

    用户选择日期 月份和年份 然后按一个按钮 根据他选择的日期向他显示数据库的值 不知道代码问题出在哪里
  • div 中的文本字符有限,添加“阅读更多”链接并在单击链接时显示所有字符

    我有一个 div 里面有文本 使用 PHP 和 MySQL 显示 结构如下 div class description p Here is a lot of text p div 我想在 p 标签内的文本超过 100 个字符时显示 阅读更多
  • PHP - 警告:strpos() [function.strpos]: 空分隔符是什么意思?

    警告 strpos function strpos 空分隔符是什么意思 我有这个 if strpos 039 text false text str replace 039 text 猜测一下 我会说 text是一个空字符串 感谢马克指出细
  • Ajax文件上传

    我想使用 Ajax 和 php 上传文件 我有一个表格
  • PHP 的脚手架 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 PHP 中有什么东西可以像 Rails 一样创建基本的脚手架吗 编辑 我需要一些东西来快速原型化 一些框架比如Symfony http www sym
  • 为 NFL api 生成访问令牌

    NFL 有一个 API 服务 link https api nfl com docs getting started index html https api nfl com docs getting started index html
  • 切换到 mysqli 是个好主意吗?

    我正在考虑为我的所有 php 项目切换到 mysqli 我的代码编写方式 我运行非常简单的网站并构建了自己的基本框架 我在所有网站上使用该框架 我在修改函数和类时不应该遇到太多问题 然而 我只听说过关于准备好的语句的积极的事情 除了一些关于
  • 如何在php中使用一张图像绘制形状

    我需要使用图像的一部分来创建帧图像 例如 用户将从后端上传图像片段 现在我需要根据前端用户的要求在前端创建一个框架 用户将选择框架的高度和宽度 然后他将选择该图像片段 如下所示 我没有办法做到这一点 我尝试通过 css 和 html can
  • 付款成功后保存到数据库(paypal)

    我试图找出在客户使用 paypal 支付商品费用后将数据 之前以表单提交 保存到数据库的最佳方法 沿着这个过程的一些事情 1 在实际网站上填写表格 gt 2 登录 Paypal gt 3 立即付款 PayPal gt 4 数据已插入数据库
  • 合并 2 个数组并合并数字键的结果

    我有 2 个数组 我希望通过每个数字键将其中合并 分组在一起 例如 Array1 2009 gt 131 2008 gt 940 2007 gt 176 2006 gt 1 Array2 2008 gt 9 2007 gt 3 我希望输出是
  • php如何生成动态list()?

    根据我的理解 这就是 list 的工作原理 list A1 A2 A3 array B1 B2 B3 所以在帮助下list 我们可以相应地从数组中分配值 这是我的问题 如何生成动态list 1 基于数据库返回结果 我不确定有多少 但我将其全
  • 使用 file_get_content 发布数据

    我已经做了一些关于如何使用的研究file get content与帖子 我也读过this one https stackoverflow com questions 2445276 how to post data in php using

随机推荐

  • 如何解析和简化像“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 访问 保护受限制页面内的这些资源的最佳方法是什么 我知道我