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

时间:2011-03-21 01:37:55

标签: php security httpwebrequest

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

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

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

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

3 个答案:

答案 0 :(得分:9)

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

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

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

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

$authBit = $username . ':' . $authToken;
$hash = hash_hmac('sha256', $authBit, $digestToken);
$authField = $username . ':' . $hash . ':' . $digestToken;

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

list ($user, $hash, $digestToken) = explode(':', $authField);

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

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

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

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

答案 1 :(得分:3)

Security trough obscurity不起作用,而使用POST而不是GET只会让你的信息稍微难以抢夺,如果你实际上是在寻找用户的话。

这里的真正问题是阻止人们拦截服务器之间的传输流量。解决这个问题的唯一方法是加密,例如SSL。当您传输密码等敏感信息时,总是尝试使用SSL是个好主意。这可能稍微难以实现,但在安全性方面绝对值得。

但是,保持敏感数据不被抢夺的最佳方法是不首先传输它。考虑是否可以让应用程序检查更新而不传输密码。如果有更新,您可以使用HTTPS将用户发送到网页下载更新,这样可以省去自己实施SSL的麻烦。

答案 2 :(得分:-2)

使用.htaccess修改并隐藏您网站的网址。 例如:

www.mysite.com/index.php?cat=1234&foo=5678

看起来像:

www.mysite.com/cat-1234-foo-5678-index.html

当你成功创建.htaccess文件时,两个网址的行为都是一样的。