php - 如何限制对 PHP 文件的访问?

标签 php http

我想限制对我服务器上的 PHP 文件的访问。此 PHP 文件从 HTTP GET 请求中获取数据并将其附加到文件中。简单的。但我不希望执行此 PHP 文件,除非 HTTP 请求是从我开发的智能手机应用程序中生成的。

我不想单独验证每个用户。我希望我的应用程序,并且只有我的应用程序能够将请求发送到 PHP 文件。我不希望人们在浏览器中输入类似格式的请求 (http://www.mydomain.com/check.php?string=blahblahblah) 并产生相同的效果。

我考虑过检查 HTTP_USER_AGENT 或其他一些变量,但我担心它们也很容易被欺骗。我可以在我寻找的应用程序中嵌入一个 key ,但该 key 也可能被泄露。

下一步是让服务器向我发送挑战,我会做出适当的回应。或者我什至可以调查 PKI。但考虑到我并不是要保护任何真正有值(value)的东西,只是为了防止轻微的破坏行为,有什么相对简单的方法可以做到这一点。

我是想在这里重新发明轮子吗?是否已经有一种简单、行之有效的方法来做到这一点?

最佳答案

FWIW,这是我能想到的最安全的方法,不会严重影响性能 - 本质上是 RESTful(ish) 方式,因为进一步提升它需要多个请求和存储在服务器上的连接状态信息:

  • 应用程序和服务器具有相同的硬编码盐字符串,对于移动应用程序的每个后续版本都是唯一的。此字符串必须保密。
  • 当用户在他们的设备上安装该应用程序时,该应用程序会联系您的服务器并通知它该应用程序的版本,以及设备的 IMEI ,您正在使用的任何移动平台的 API 都应该使您能够检索。
  • 服务器为该应用程序实例生成一个唯一 key ,该 key 被发送回应用程序并存储在设备上,并将其与 IMEI 和安装的版本一起存储在服务器端数据库中。
  • 在日常操作期间(即提出问题中概述的请求时),该应用程序遵循以下程序:
    • 检索以下信息:
      1. 设备IMEI
      2. 应用 key
      3. 应用版本
      4. 硬编码盐字符串
      5. 为附加盐随机生成的字符串(微秒的当前时间戳的导数对于合理的熵量总是有好处的)。
    • 将所有这些信息片段连接在一起,最好在它们之间使用硬编码填充,并生成结果字符串的哈希值。
    • 向服务器发送以下信息以及实际请求数据(可能在 cookie 中用于微小额外的安全性):
      1. 生成哈希
      2. 应用 key
      3. 随机生成的字符串用作附加盐
  • 服务器现在使用应用 key 从数据库中检索该实例的设备 IMEI 和应用版本,并使用该信息以及版本 ID 的硬编码盐字符串和设备发送的附加盐字符串构造哈希。如果服务器上生成的哈希值与移动设备生成的哈希值匹配,则请求成功,否则拒绝。
  • 此过程中的所有通信均通过 HTTPS。

为了突破这个系统并成功欺骗请求,攻击者需要知道以下内容:

  1. 设备IMEI
  2. 应用 key
  3. 应用版本
  4. 硬编码盐
  5. 用于生成散列的机制(输入字符串的精确格式和散列算法)。

显然,如果您使用的是移动设备,则 1 - 3 很容易提取,但如果不对应用程序进行逆向工程,则无法找到 4 和 5(对于有知识和经验的人来说,您几乎无法阻止)耐心去做)。

中间人攻击基本上是不可能的 - 即使在突破 SSL(至少可以说这是非常重要的)并且对应用程序进行逆向工程以获取 4 和 5、1-3 之后也是如此无需对哈希进行蛮力攻击即可检索,哈希非常复杂,平均需要数亿年(请参阅 this page 了解我是如何得出该数字的),特别是如果三个之一是可变长度 - 应用程序版本字符串很容易成为。

关于php - 如何限制对 PHP 文件的访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11467098/

相关文章:

php - 通过 PHP 发送推送通知

python - 从 Web 服务器产生类似文件的响应是如何工作的?

http - Golang 相当于 java servlet 过滤器

php - 使用 PHP 保存以前的首选项/选择

php - 按下按钮并使用包含注释的文本区域更新 mysql 数据库中的注释

php - 比较两位数的优雅解决方案

php - 无法获取 _POST 元素

http - 使用 httputil 和 gorilla/mux 进行反向代理

security - 通过 HTTP 的 session 劫持

android - 从 android 中的 HttpURLConnection 获取响应代码