Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/239.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何限制对PHP文件的访问?_Php_Http - Fatal编程技术网

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

如何限制对PHP文件的访问?,php,http,Php,Http,我想限制对服务器上PHP文件的访问。此PHP文件从HTTP GET请求中获取数据,并将其附加到文件中。简单。但是我不希望执行这个PHP文件,除非HTTP请求是从我开发的智能手机应用程序中生成的 我不想单独验证每个用户。我希望我的应用程序,并且只有我的应用程序,能够将请求发送到PHP文件。我不希望人们输入格式类似的请求(http://www.mydomain.com/check.php?string=blahblahblah)并具有相同的影响 我曾考虑过检查HTTP_USER_代理或其他变量,但我

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

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

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

下一步是让服务器向我发送一个挑战,我会相应地做出响应。或者我甚至可以研究PKI。但是,考虑到我并没有试图保护任何真正有价值的东西,只是为了防止轻微的破坏行为,那么做这件事的相对简单的方法是什么呢


我是想在这里重新发明轮子吗?是否已经有一种简单且经验证的方法可以做到这一点?

HTTP请求可以按发送方希望的任何方式逐字符构建。欺骗总是可能的。

在你的应用程序和php文件中定义一个salt,然后将该salt与当前时间一起散列。这不太可能被欺骗

$hash = sha1(time() . 'bladieblasalt');

if($_GET['hash'] == sha1(time() . 'samehash'))
{
    echo 'valid';
}
只需在PHP应用程序中添加授权(登录、密码、会话等和/或“API密钥”),然后让手机应用程序在发送所需请求之前先进行授权。你可能没有考虑这一点,因为如果你的脚本很简单,可能会给它增加一些混乱,但是几乎每一个Web系统都需要它,你最终也会面对它。


让您的手机应用程序通过HTTPS登录到PHP应用程序,以排除拦截。

没有保证方法。您可以使用oauth身份验证。。。根据您使用的平台以及将应用程序部署到手机的方式,也许您可以将密钥编译到应用程序本身?任何东西都会被破解,没有100%的安全性。。。但尝试并不羞耻。:)


就我个人而言,我在移动应用程序中使用的是RESTful身份验证,定期登录/通过对令牌进行通信,直到过期。:)

首先,你需要在你的应用程序中实现ssl,其他不太了解ssl的人只需将手机连接到wifi上,然后用wireshark或cain和abel等嗅探应用程序与你的站点之间的流量。并获得url和传递的任何参数,无需反汇编任何内容

应用程序连接到您的站点,用户登录,无论是来宾还是成员,您的服务器都会为应用程序分配请求id,并且此密钥/令牌会随每个请求一起传递,并在服务器上的会话中进行验证

该令牌看起来像:
UNIQUE\u请求\u ID\u由\u服务器分配:APPsIP:APPsTIME
加密此字符串并将其作为
$\u GET['token']

然后在服务器上解密字符串并将字符串分解成各个部分,然后对照数据库或会话检查请求id、ip和时间是否匹配ect,如果一切正常,则执行哪个操作

就像安全登录系统一样,为每个用户分配一个唯一的salt,并将其存储在用户请求id的旁边


底线是,让施虐者很难滥用这个系统。99%的人甚至不想玩小提琴,而另外1%的人想玩小提琴,ips被阻止。

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

  • 应用程序和服务器有一个相同的盐字符串硬编码,每个后续版本的移动应用程序都是唯一的。此字符串必须保持私有
  • 当用户在其设备上安装应用程序时,该应用程序会联系您的服务器,并通知其应用程序的版本以及设备的版本,您使用的任何移动平台的API都应允许您检索该应用程序
  • 服务器为应用程序实例生成唯一密钥,该密钥发送回应用程序并存储在设备上,并将其与IMEI和安装版本一起存储在服务器端数据库中
  • 在日常操作期间(即提出问题中概述的请求时),应用程序遵循以下步骤:
    • 检索以下信息:
    • 设备IMEI
    • 应用程序密钥
    • 应用程序版本
    • 硬编码盐串
    • 随机生成的附加盐字符串(当前时间戳的微秒导数对于合理的熵量总是好的)
    • 将所有这些信息连接在一起,最好在它们之间使用硬编码填充,并生成结果字符串的散列
    • 将以下信息与实际请求数据一起发送到服务器(可能在cookie中增加一点点安全性):
    • 生成的散列
    • 应用程序密钥
    • 随机生成的字符串用作附加盐
  • 服务器现在使用应用程序密钥从数据库检索该实例的设备IMEI和应用程序版本,并使用该信息以及版本ID的硬编码salt字符串和设备发送的附加salt字符串来构造哈希。如果服务器上生成的哈希值与移动设备生成的哈希值匹配,则请求是良好的,如果不是拒绝请求的话
  • 此过程中的所有通信都是通过HTTPS进行的
为了突破此系统并成功欺骗请求,攻击者需要了解以下信息:

  • 设备IMEI
  • 应用程序密钥
  • 应用程序版本
  • 硬编码盐<