2013-08-23 52 views
2

我已閱讀有關用戶能夠操縱網站cookie並使用它來利用安全漏洞的信息。我做了一個搜索,發現了一個在線發佈的想法。這裏是下面的代碼,在用戶的用戶名和密碼被認證之後;如何加密網站cookie

$Separator = '--'; 
$uniqueID = '[email protected]'; 
$Data = $userID.' '.md5('65748'); 

$expire=time()+60*24; 
setcookie('verify-user', $Data.$Separator.md5($Data.$uniqueID), $expire); 

上面的代碼將使用uniqueID,userID,MD5哈希數字和分隔符來設置cookie。 uniqueID,md5散列號和分隔符由開發人員設置。這個想法是,用戶將無法操作cookie,因爲不知道UniqueID和md5散列號。下面的代碼是用來測試每​​個Cookie,如果他們被操縱或不

if ($_COOKIE) { 

$Separator="--"; 
$uniqueID = '[email protected]'; 

$Cut = explode($Separator, $_COOKIE['verify-user']); 
if (md5($Cut[0].$uniqueID) === $Cut[1]) { 
    $_COOKIE['verify-user'] = $Cut[0]; 

} else { 

    echo "fake cookie"; 

} 
} 
else { 
    echo "fake cookie"; 
} 

我想知道如果這種方法的安全性緊張或者有漏洞了。批評和更正歡迎

+0

md5是**不安全**用於任何類型的安全 –

+1

除非您有一個非常好的理由,否則完全隨機的cookie與服務器端存儲的所有相關信息應該是首選。 – Thilo

+1

@Thilo:通過使用會話已經在PHP中爲您實施。 –

回答

2

這就是所謂的消息簽署。您將郵件與祕密一起散列,並將該「簽名」附加到郵件本身。這允許接收者驗證消息的創建者/簽名者是否擁有該祕密,而不會泄露該祕密本身。

與具體實現的問題是,

  • 祕密太小
  • 的哈希算法是不適合的任務
  • 餅乾永遠不會改變,永遠不會過期;如果一張餅乾被盜,就沒有追索權

你應該使用更長的祕密,時間越長越好。您還應該使用適合該任務的哈希算法,即像HMAC(hash-based message authentication)這樣的哈希算法。例如: -

hash_hmac('sha512', $data, $secret) 

你可以看到類似的事情的實現,包括到期值的,here


儘管最重要的事情:想一想簽名的純文本消息是否是最好的方式來到這裏擺在首位。也許你想要一個類似會話的系統,其中完全沒有意義的隨機字符串被用作存儲在服務器上的數據的標識。這完全消除了用戶操作cookie的問題。