我已经实现了一个PHP URL API,我正在从我的iPhone App调用,以访问我服务器上的某些数据。我不确定如何制作它以便只允许我的应用程序调用API。到目前为止,我非常简单的解决方案是在URL中传递一个密钥,但如果有人想要,然后被不需要的用户使用,它就很容易被捕获。我该怎么办?感谢您的建议。
答案 0 :(得分:4)
您正在使用密钥,但使用该密钥创建使用URL而不是密钥传递的哈希。服务器具有相同的密钥,可以重新创建相同的哈希。如果不匹配,那么它无效。
$key = 'my secret key';
$data_item1 = 'something';
$data_item2 = 'something else';
$random_key = mt_rand(100000,10000000);
$check = sha1($key . $data_item1 . $data_item2 . $random_key);
$submit_data = array(
'data_item1' => $data_item1,
'data_item2' => $data_item2,
'check' => $check,
'checkid' => $random_key
);
服务器与应用程序具有相同的$ key。然后,它可以提交数据元素并运行相同的sha1并比较sha1结果。您不需要使用要提交的所有数据项来创建sha1哈希。重要的是从提交中遗漏一些“关键”数据以生成哈希。这也验证了数据在传输过程中没有被更改或篡改,因为它是一种校验和。
随机数据是为了确保每个请求都有不同的哈希值,因此检测模式更加困难。这种方法应该足以阻止随意的黑客行为。
答案 1 :(得分:0)
要求用户名和密码怎么样?
一个简单(但不完美)的方法可能是Basic access authentication。
答案 2 :(得分:0)
通过HTTPS进行通信。我希望应用程序与服务器进行初步检查。如果服务器以某种方式响应(例如,使用特定的状态代码或响应字符串),则应用程序知道它是合法的。然后,应用程序可以将信息发布到PHP API,并且可能使用用户名和密码进行身份验证(或者如果您确实想要复杂,请让服务器在初步检查时返回密码并使用该密码对服务进行身份验证)。 / p>
通过HTTPS进行通信,确保所有内容都经过加密。通过初步检查,您可以更加确信某人没有创建虚假SSL证书来伪装他们的虚假服务器以获取您的身份验证详细信息。然后,应用程序安全地完成响应。这个系统比较复杂,所以这应该更安全。
顺便提一下,请注意在代码中放置敏感的用户名和密码。如果有人反编译你的可执行文件,他们就能看到它们。选择做一些更动态的事情,比如在与服务器进行初步检查后抓取密码。