講解 SQL 連線字串中關於 Persist Security Info 參數的用途

可能許多人不知道資料庫連線參數 (Connection String) 中的 Persist Security Info 參數是做什麼用的,且用到的機會也很少,但我們這幾天就遇到了一個跟 Persist Security Info 參數有關的錯誤,特別分享一下處理的經驗。

先從 Visual Studio 的 Server Explorer 講起,請先參考下圖。

當你在新增連線時,可以選擇 [Save my password] 選項,如果你有勾選,可以點選 [Advanced...] 按鈕查詢透過工具幫你產生的連線字串。

當你在新增連線時,可以選擇 [Save my password] 選項,如果你有勾選,可以點選 [Advanced...] 按鈕查詢透過工具幫你產生的連線字串。

Add Connection -> Advanced Properties

實際儲存在 web.config 的連線參數大概將會長這樣:

Data Source=.;Initial Catalog=master;Persist Security Info=True;User ID=sa;Password=xxxx

光透過 Visual Studio 工具上的說明就可大略得知 Persist Security Info 的用途。在預設不加上 Persist Security Info 的情況下,預設為 False,當程式需要進行資料庫連線時,此時會將「敏感資訊」例如:密碼(Password) 等資訊暫存在連線物件中(記憶體裡),當連線建立成功之後,就會立即將「敏感資訊」清除,這能確保記憶體中的「敏感資訊」會立即清除,降低資訊揭露(Information Leakage)的風險,因為這樣的風險也是出現在 OWASP Top 10 (2007) 的第六位 (A6)。

精確的來說,連線資訊是在 SqlConnection 類別的 ConnectionString 屬性或DbConnection 類別的 ConnectionString 屬性中。

當你將 Persist Security Info 宣告為 True 時,即便連線已經建立,也會將密碼儲存在記憶體中,供後續程式引用,而我們就剛好有一支程式需要在程式執行的過程中取得新的連線,需要用到原本的連線參數,所以需要將 Persist Security Info 宣告為 True 才能正常運作。

其實也不一定要將Persist Security Info 宣告為 True,因為只要將該程式修改成直接從 web.config 中重新讀取 Connection String 即可。

除此之外,我同事也遇到一個奇怪的事件,就是同一段程式碼在執行時明明有些頁面不會掛掉,有些頁面就會掛掉,不同人看同一頁時,也會有時成功、有時失敗的情況。那是因為 ADO.NET 有 Connection Pool 的概念,在連線數足夠的情況下是不需要重新建立連線的,所以才會有這種類似靈異事件的情況。

我必須要再次聲明,在程式設計的領域沒有什麼「靈異事件」只有因為你不了解技術細節無法理解問題時才會感覺「有鬼」,所以養成追根究底的習慣是很重要的,真理是越辯越明,如果一直讓自己處於一知半解的狀態,慢慢的就會變的越來越「迷信」。

相關連結

  

此文章由 will 發表於 2009/7/17 下午 01:40:51

永久連結 | 評論 (4) | 此文章的RSSRSS comment feed |

分類: .Net | SQL Server

標籤: , , ,

收藏:

相關文章

評論

七月 18. 2009 12:46

tomexou

從上文感覺Persist Security Info=true就是把密碼存起來或不清除記憶體,那設為false豈不更安全嗎? 還是說false雖安全,但若db tcp/ip連線逾時後,程式又會重新讀取id/pw再建立db連線?

為了避免認證上的麻煩,通常我都是設true的。文章若能解釋設與不設的效能損耗或背後成本,或許能更清楚設什麼比較好,其成本為何?

tomexou tw

七月 20. 2009 09:37

will

tomexou: 設與不設對效能應該沒多大差別,只有「安全」方面的議題。

will tw

九月 4. 2009 08:41

ㄎㄎ

我想請問一個問題
關於在ASP.NET的伺服器總管理面建立資料庫的話
那帳號密碼要去哪裡設定才可以能夠成功連線
之前聽說SQL內建帳號為SA 密碼12345
但是試過不能夠建立連線
謝謝你

ㄎㄎ tw

九月 4. 2009 10:06

will

"聽說SQL內建帳號為SA密碼12345"
=> 沒有「內建sa密碼12345」這回事,不要道聽途說。^^

你要先從資料庫管理者得到帳號、密碼才能建立連線,如果資料庫是你自己安裝的,密碼就要問失主您了。

will tw

新增評論


(將顯示您的Gravatar圖示)  

  Country flag

[b][/b] - [i][/i] - [u][/u]- [quote][/quote]



線上預覽

三月 15. 2010 23:38