我想限制对我服务器上的 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 和安装的版本一起存储在服务器端数据库中。
- 在日常操作期间(即提出问题中概述的请求时),该应用程序遵循以下程序:
- 检索以下信息:
- 设备IMEI
- 应用 key
- 应用版本
- 硬编码盐字符串
- 为附加盐随机生成的字符串(微秒的当前时间戳的导数对于合理的熵量总是有好处的)。
- 将所有这些信息片段连接在一起,最好在它们之间使用硬编码填充,并生成结果字符串的哈希值。
- 向服务器发送以下信息以及实际请求数据(可能在 cookie 中用于微小额外的安全性):
- 生成哈希
- 应用 key
- 随机生成的字符串用作附加盐
- 检索以下信息:
- 服务器现在使用应用 key 从数据库中检索该实例的设备 IMEI 和应用版本,并使用该信息以及版本 ID 的硬编码盐字符串和设备发送的附加盐字符串构造哈希。如果服务器上生成的哈希值与移动设备生成的哈希值匹配,则请求成功,否则拒绝。
- 此过程中的所有通信均通过 HTTPS。
为了突破这个系统并成功欺骗请求,攻击者需要知道以下内容:
- 设备IMEI
- 应用 key
- 应用版本
- 硬编码盐
- 用于生成散列的机制(输入字符串的精确格式和散列算法)。
显然,如果您使用的是移动设备,则 1 - 3 很容易提取,但如果不对应用程序进行逆向工程,则无法找到 4 和 5(对于有知识和经验的人来说,您几乎无法阻止)耐心去做)。
中间人攻击基本上是不可能的 - 即使在突破 SSL(至少可以说这是非常重要的)并且对应用程序进行逆向工程以获取 4 和 5、1-3 之后也是如此无需对哈希进行蛮力攻击即可检索,哈希非常复杂,平均需要数亿年(请参阅 this page 了解我是如何得出该数字的),特别是如果三个之一是可变长度 - 应用程序版本字符串很容易成为。
关于php - 如何限制对 PHP 文件的访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11467098/