PHP - 安全地将数据从站点传递到另一个站点

Ale*_*lex 8 php security httpwebrequest

我有一个网站可以接收来自多个网站的请求.有点像升级检查.这些网站将发送用户名,密码,应用程序版本等信息,然后我的网站将根据此信息发送回复.

基本上这是一个$_GET请求,如:

http://www.mysite.com/?user=boo&password=foo&version=4

我想知道是否会出现这样的安全问题.这个数据能以某种方式被"截获"吗?

irc*_*ell 9

好吧,我强烈建议不要在任何情况下(即使在SSL下)在纯文本中发送用户名/密码.相反,我建议使用摘要形式的身份验证.

相反,我建议生成一个大的身份验证令牌(一个大的随机字符串,128个字符可以工作).然后,用户将在他们的应用程序中安装此"令牌".

现在,当应用程序检查更新时,它会首先向您的服务器发出请求摘要令牌的请求.这是一个随机的一次性使用令牌,仅用于一个请求.您的应用程序应生成令牌,将其以持久格式(文件,内存,数据库等)与时间戳一起存储,然后将其发回.

现在,您的应用程序收到此摘要令牌($dt此处称为).然后,使用已经提供的预配置身份验证令牌对其进行hmac.

$authBit = $username . ':' . $authToken;
$hash = hash_hmac('sha256', $authBit, $digestToken);
$authField = $username . ':' . $hash . ':' . $digestToken;
Run Code Online (Sandbox Code Playgroud)

然后,您将其发送$authField到服务器.然后服务器将拆分部件:

list ($user, $hash, $digestToken) = explode(':', $authField);
Run Code Online (Sandbox Code Playgroud)

现在,您首先在数据库中查找用户的身份验证令牌并将其存储在其中$authToken.然后,你查找它$digestToken以确保它存在并且它是在不到60秒之前创建的(如果它太短,你可以调整它,但不要使它显着更长).无论哪种方式,此时都要从db中删除它(以防止它被重用).

现在,如果$digestToken存在并且有效,并且您可以找到$authToken,那么只需执行以下检查:

$stub = $user . ':' . $authToken;
if ($hash == hash_hmac('sha256', $stub, $digestToken)) {
    //valid user
} else {
    //Not valid
}
Run Code Online (Sandbox Code Playgroud)

它的好处是可以每次更改已发送的令牌,并且单个http请求(读取请求流的任何人都无法从请求中获取任何敏感信息,除了您可以进一步屏蔽的用户名,如果您愿意的话) ...