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

The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

講解 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 的概念,在連線數足夠的情況下是不需要重新建立連線的,所以才會有這種類似靈異事件的情況。

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

相關連結