2011-03-21 99 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的麻煩。

相關問題