我想限制我的服务器上获得的PHP文件。 这个PHP文件从HTTP GET请求中获取数据,并将其追加到文件中。 简单。 但我不想除非HTTP请求从智能手机应用程序我已经开发了内产生执行这个PHP文件。
我不希望每个用户单独进行身份验证。 我想我的应用程序,只有我的应用程序,以便能够将请求发送到PHP文件。 我不希望人们在同样形成请求(http://www.mydomain.com/check.php?string=blahblahblah)到浏览器中键入并具有相同的影响。
我曾经想过检查HTTP_USER_AGENT,或其他一些变量,但我担心他们可能很容易欺骗了。 我可以嵌入钥匙插入我的应用程序,我寻找,但关键也受到影响。
下一步将有服务器送我去,我作出适当的反应是一个挑战。 或者,我甚至可以考虑PKI。 但是,什么是一个相对简单的方式来做到这一点,因为我不是试图保护的真正有价值的东西,只是为了避免未成年人为破坏。
我是不是想在这里重新发明轮子? 有没有已经可以简单,可靠的方式来做到这一点?
FWIW,这里是我能想到的不会严重影响性能的最安全的方法 - 本质上是基于REST(ISH)的方式,为斜坡它的任何进一步需要多个请求和服务器上存储的连接状态信息:
- 该应用程序和该服务器具有相同的盐串硬编码,独有的移动应用的每个后续版本。 此字符串必须保密。
- 当用户安装设备上的应用程序,该应用中的联系人您的服务器和通知的应用程序的版本,它和设备的IMEI ,它的API任何移动平台,你正在使用应使您能够检索。
- 服务器生成与所述IMEI和安装的版本的服务器端数据库针对其发送回应用程序和存储在设备上的应用程序的该实例的唯一密钥,并将其存储。
- 在一天中的日常操作(即使在问题概述的请求时),应用程序遵循以下过程:
- 检索以下信息:
- 设备IMEI
- 应用程序键
- 应用程序版本
- 硬编码字符串盐
- 对于附加盐随机生成的字符串(以微秒为单位的当前时间戳的衍生物总是好的为熵的一个合理的量)。
- 串连所有这些信息一起,优选与它们之间的硬编码填充和产生所得到的字符串的散列。
- 发送到服务器的下列信息与实际请求数据(也许在饼干安全的小的额外位)一起:
- 产生的散列
- 应用程序键
- 用作附加盐随机生成的字符串
- 该服务器现在使用的应用程序键,从数据库中检索该实例的设备IMEI和应用程序的版本,并使用与硬编码盐字符串版本ID和额外的盐串设备发送的信息一起构建哈希值。 如果在服务器上生成的散列由所述移动设备生成的散列相匹配,则请求是好,如果不是拒绝它。
- 在这个过程中的所有通信是通过HTTPS。
为了通过这个系统,打破并成功地欺骗请求,攻击者需要了解以下内容:
- 设备IMEI
- 应用程序键
- 应用程序版本
- 硬编码盐
- 您用来生成散列(输入字符串的准确格式和散列算法)的机制。
显然,如果您正在使用移动设备1的工作 - 3很容易提取,但4和5离不开逆向工程应用程序(这实际上是没有什么可以做,以防止对人的知识和耐心被发现做到这一点)。
一个中间人攻击是基本不可能 - 甚至可以通过SSL打破后(这是不平凡的,至少可以这样说)和逆向工程的应用获取4和5,1-3离不开检索散列强力攻击,这是非常复杂,这将需要几亿年的平均(见这个页面 ,看看我是如何得出这个数字),尤其是如果这三个中的一个可变长度的-这应用程序版本字符串可以很容易地。
定义两张您的应用程序和PHP文件盐,然后凑盐分与当前时间相结合。 那是不可能永远得到欺骗。
$hash = sha1(time() . 'bladieblasalt');
if($_GET['hash'] == sha1(time() . 'samehash'))
{
echo 'valid';
}
首先,你需要实现SSL到您的应用程序别的有人用小知识可以简单地有电话连接在有wifi和嗅探程序和网站使用Wireshark或者该隐和亚伯ECT之间的流量。 并获取URL,并通过任何参数,无需拆卸任何东西。
应用程序连接到您的网站,用户登录,它的客人或成员是否您的服务器分配请求ID,并且这个键/令牌与每个请求一起传递与您的服务器上的会话中验证的应用程序。
令牌看起来像: UNIQUE_REQUEST_ID_ASSIGNED_BY_SERVER:APPsIP:APPsTIME
加密这个字符串并把它作为$_GET['token']
然后在服务器上解密字符串和explode()
串入其零部件和核对数据库或会话请求ID,IP和时间匹配ECT,如果一切都很好做它永远。
就像一个安全登录系统为每个用户分配和商店,沿着一侧的用户请求ID一个独特的盐。
底线是,只是使它很难滥用者滥用系统。 99%的人甚至不会觉得捣鼓另1%到那里IPS阻断。
如果你不希望每个用户的任何事情,但只有每个应用,你将不得不依靠内置到应用程序中的秘密。 任何拆卸应用程序将最终能够找到,所以有些迷惑也许会有帮助,但它不会让有决心的人离你的页面。
这就是说,有使用任何公钥密码的小点。 随着应用程序,一边是个什么欺骗者可能会感兴趣,他们已经有机会获得一对密钥的更有价值的一半。 所以,你可能会使用一个共享的秘密,以及使用一些方法。
你真要查的是传输数据的真实性。 所以,简单地采取数据的核心(即所有领域,其真正的问题),将它们连接与共享的秘密,散列结果,并将其传送消息摘要。 服务器进行相同的计算,并检查所计算的摘要相匹配的传送之一。 如果确实如此,该消息的发送者必须知道的共享密钥。
还有一些机会重放攻击,即有人记录有效信息,后来重复它。 您可以在服务器端检测到确切的重复,防止延迟重播通过在该消息的签署部分时间戳。 如果你的服务器允许客户端和服务器时间戳之间的巨大差异,也将不得不继续重复信息为相同的时间。 如果只接受小的差异,可以用较小的重复高速缓存工作,但因为服务器更可能拒绝他们的请求,认为它太老用户提供malconfigured设备可能是恼火。
还要说明一点:你写了一个GET
请求,导致一些文件的写操作。 我总是会有些状态更改操作有关联POST
代替。 如果应用程序是你自己的,没关系多,但浏览器被称为重发GET
请求,而不会询问用户,从而导致了一些动作重复的请求。
有没有担保方式。 您可以将您使用的是什么平台上使用OAuth认证...取决于如何您部署的应用程序到手机上,也许也许你可以编译你的钥匙插入到应用程序本身? 什么都可以和将永远被破解,也没有100%的安全......但没有试图羞辱。 :)
个人而言,我用我的移动应用什么是正规注册的RESTful认证/通过配对基于令牌的通信,直到它过期。 :)
HTTP请求可以通过字符以任何方式发送者希望建立角色。 欺骗永远是可能的。
只需添加授权(登录,密码,会话等和/或“API密钥”)添加到您的PHP应用程序,然后让你的手机应用程序在发送所需的请求之前先授权。 你可能没有考虑到,因为如果你的脚本是简单的,可能增加一些混乱吧,但随后又几乎每个网络系统需要的是,你会面对,以及最终。
让你的手机应用程序通过HTTPS登录到您的PHP应用程序,以排除拦截。