2011-03-21 84 views
7

我有一个站点可以接受来自多个站点的请求。有点像升级检查。 这些网站会发送用户名,密码,应用版本等信息,然后我的网站会根据这个信息发送回复。PHP - 将数据从一个站点安全地传递到另一个站点

基本上这是一个$_GET要求,是这样的:

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

我在想,如果有会做这样的东西任何安全问题。这个数据能够以某种方式被“拦截”吗?

+0

您可能会查看哈希/盐。即,客户端请求使用散列密码,只有服务器知道使用盐进行散列。 – 2011-03-21 01:41:16

+0

这是对于http://area51.stackexchange.com/proposals/12123/webservice-apis – Cyclone 2011-03-21 02:23:55

回答

8

那么,我会强烈建议而不是在任何情况下(甚至当在SSL下)在纯文本上发送用户名/密码。相反,我会建议使用摘要形式的身份验证。相反,我会建议生成一个大的身份验证令牌(一个大尺寸的随机字符串,128个字符将工作)。然后,用户将在他们的应用程序中安装这个“令牌”。

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

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

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

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

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

,首先查找用户的身份验证令牌在数据库中,并存储在$authToken。然后,您查找$digestToken以确保它存在并且创建时间不到60秒(如果太短,可以调整它,但不要太长)。无论哪种方式,在这一点上从数据库中删除它(以防止它被重用)。

现在,如果$digestToken存在并且是有效的,你可以找到一个$authToken,那么就做以下检查:

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

它改变了发送令牌每过一个HTTP请求的好处(任何阅读请求流的人都将无法从请求中获得任何敏感信息,除了您可以进一步屏蔽的用户名外,如果您愿意的话)...

-2

使用.htaccess修改和隐藏你的网站的网址。 如:

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

会看起来像:

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

当u成功创建.htaccess文件,这两个网址会采取同样。

+2

完美的问题类型,这不会增加任何有价值的保护,所有信息仍然可用。它可能稍微难以找到,但没有真正的保护。 – Nico 2011-03-21 02:07:00

+0

这只是一个演示伙伴。您可以根据所需的任何算法对值和变量进行编码。 – 2011-03-21 02:11:52

+0

这个url也可以这样设计:http://www.mysite.com/dbu4321gpp8765cheapdata.html – 2011-03-21 02:12:37

2

Security trough obscurity不起作用,并且使用POST代替GET仅会使信息稍微难以抓取,如果您实际上正在看肩膀上的用户。

这里真正的问题是阻止人们拦截服务器之间的传输流量。解决这个问题的唯一方法就是加密,比如SSL。在传输密码等敏感信息时,始终尝试使用SSL是个不错的主意。实施起来可能会稍微困难一点,但在安全性方面绝对值得。

但是,保持敏感数据不被抓起来的最好方法是首先不传输它。考虑是否让应用程序检查更新而不传输密码。如果有更新可用,您可以使用HTTPS将用户发送到网页以下载更新,从而为您节省了自行实施SSL的麻烦。

相关问题