2013-10-19 164 views
0

我在數據庫表設計,存儲一些散列字符串作爲客戶機將用戶會話令牌存儲在localStorage中是否存在安全風險?

localStorage['tokens'] = [username, string1, string2, .... ] 

的「令牌」的認證系統,並與相關聯排這些令牌

____________________________________ 
| Table: current_user_sessions  | 
------------------------------------ 
| username | token1 | token2 | ... | 

使任何時候用戶嘗試完成某個操作時,客戶端機器都會查詢數據庫,詢問包含匹配令牌和用戶名的行,以驗證用戶是否登錄了有效會話。

我將這些標記作爲變量發送到php頁面,該頁面檢查以確保會話有效。

$tokens = $_GET['tokens'] 
$session_is_valid = query_that_checks_db_for_tokens($tokens) 
return $session_is_valid 

是否有可能有人通過XSS攻擊可以訪問其他用戶的localStorage的,這是保持用戶會話安全不安全呢?

回答

0

這種方法的主要問題是本地存儲容易受到XSS的攻擊,因爲它可以通過JavaScript訪問(當然,有一個容易受XSS影響的頁面本身就是一個問題)。如果你的腳趾足夠小以適應餅乾,那麼這是放置它們的最佳位置。

如果您在cookie上設置僅HTTP標誌,瀏覽器將不允許JavaScript訪問它。如果您在Cookie上設置了安全標誌,則瀏覽器將僅以HTTPS請求發送它。如果您要發送與安全有關的令牌,則應該使用兩個標誌。

+0

如果它不適合cookie,該怎麼辦?除了db,你別無選擇,並確保你的輸入是安全的,正如我在我的回答中提到的那樣。 – jayadev

+0

@jayadev如果它不適合cookie,它會變得不安全。 OP在詢問本地存儲是否安全。答案是不。對於存儲更多**安全**數據客戶端方面而言,通常沒有一個好的參數可以存放在cookie中。 – Aurand

-1

如果用戶數據很小(或可以壓縮)並適合用戶cookie,則應該使用cookie。這樣就避免了本地存儲以及隨之而來的安全問題。

如果不是這種情況,那麼您不得不使用本地/集中存儲,當您從http參數讀取標記並直接在mysql查詢中使用時,您應該注意的主要項目爲sql injection。通常使用mysql_real_escape_string或參數化查詢來防止這種情況(細節here)。您也應該避免輸入以防止XSS獨立於您的會話存儲策略。

一些細節需要注意的:

  • 用戶名是一個唯一的標識符(某種GUID的)。
  • 通常用於存儲會話的更快方式是使用memcached羣集來處理會話數據。
  • 請注意Cross side request forgery並使用碎屑,因爲您正在更新用戶數據。
+0

我會斷言它事實上是不安全的。OP詢問XSS是否可以用來竊取存儲在本地存儲中的驗證令牌,並且可以。 – Aurand

+0

在您的計算機上瀏覽互聯網可能不安全,但解決方案不會停止瀏覽:)。正如我在我的解決方案中提到的那樣,如果您當然可以使用cookie,您應該查看模式和數據量,我假設數據很大,或者他可能已經考慮過cookie。那麼除了使用像db這樣的中央存儲之外別無選擇。解決方案是確保你的輸入是乾淨的。 – jayadev

2

您的瀏覽器保護使用相同的起源策略的本地存儲,所以在http://a.com託管的網頁上運行的JavaScript代碼無法訪問通過http://b.com在頁面上運行的JavaScript代碼存儲在本地存儲。如果您的網頁存在XSS漏洞,並且人們可以在其中注入Javascript代碼,則可以訪問您的本地存儲。

有人說,你的計劃似乎是合理的。花一點時間確保你的頁面沒有任何XSS漏洞,這似乎是對時間的一種很好的利用。

相關問題