我需要创建一个php文件,它将在我的网络服务器上做一些工作,并将通过互联网从另一台服务器上的程序调用。 假设将完成工作的php文件位于www.example.com/work.php
保护未经授权的www.example.com/work.php调用的最佳方法是什么?
我需要的是一些机制,以便当目标程序访问url(带有一些查询字符串参数)时,工作完成,但如果有人在浏览器中键入www.example.com/work.php,访问将被拒绝,不会做任何工作。
我想到的方法是在查询字符串中添加一些“令牌”,这些令牌将由调用程序中的某些算法构造,样本结果可以附加到url:
?key=randomKeyAtEachCall&token=SomeHexadecimalResultCalculatedFromTheKey
并且密钥和令牌将在php端使用反向算法进行验证。
这样安全吗 还有更好的主意吗?
答案 0 :(得分:5)
你可以尝试几个想法!
首先尝试仅允许从服务器访问,该服务器将使用.htaccess调用您的work.php:
<FilesMatch "work\.php$">
Order deny,allow
Deny from all
Allow from 111.111.111.111
</FilesMatch>
其中111.111.111.111是将调用脚本的服务器的IP。
您可以做的另一件事是创建一种密码并将其发送到work.php,以便只允许用户访问密码。
在示例中。
调用脚本的服务器:
$hash = md5('my_secret_key' + date('dFYaG'));
// You can also use any other method you like to call the other script
// such us cURL, sockets and so on.
$f = fopen('http://www.myothersite.com/work.php?skr=' . $hash, 'r');
fclose($f);
以及托管work.php的服务器
$hash = md5('my_secret_key' + date('dFYaG'));
if($hash != $_GET['skr'])
{
die('You do not have permission to access that file...');
}
// Rest of your code goes here
答案 1 :(得分:1)
根据您访问它的方式,您只需拥有一个包含已注册API密钥的表,使用POST将数据嵌入到http请求中,并检查POST变量是否已设置,以及是否与已注册的匹配API密钥。
或者,您可以将API密码转换为关键服务器端,然后进行比较以获得更高的安全性(如果某人拥有来自数据库的直接API密钥并将其提交到work.php,则赢了一旦运行,比如md5哈希值,就要正确评估。
答案 2 :(得分:0)
你可以通过提供一个非常长的哈希并在任何一方硬编码来简化你的想法。将其视为您服务的API密钥(类似于您可能从reCAPTCHA或Twilio等服务中获得的内容)。
答案 3 :(得分:0)
如何生成RSA密钥对?然后使用公钥(使用您的应用程序)加密秘密字符串,并在PHP脚本中保持私钥安全。如果传递给PHP的字符串可以使用私钥解密(并且字符串已经过验证),那么它就是你的应用程序(当然,除非你的应用程序被破坏并且提取了公钥)。