簡體   English   中英

將ASP.NET連接到SQL Server的最佳實踐

[英]Best Practice for Connecting ASP.NET to SQL Server

我們有一個ASP.NET 4.0 Web應用程序,它通過LAN連接到單獨計算機上的SQL Server。 我使用存儲在我的Web.config中的ConnectionString(帶有SQL Server身份驗證)來執行此操作。 基本上,它是一種相當傳統的Web-Server-to-SQL策略。

但是,我們的一位客戶認為這種策略並不安全。 該客戶端表示我們應該只通過單獨的Web服務層連接到SQL Server。

我真的不想重寫這個應用程序只是為了滿足這個客戶端。 我應該告訴他什么? 有誰知道我怎么能最好地反駁這個?

提前致謝...

安全始終是一種權衡。 客戶真的害怕什么?

擁有數據庫憑證“明確”? 我已經看到審計人員指出這是一個潛在的漏洞,但實際上,如果某人已經破壞了您的Web服務器,他們可以針對數據庫運行任意代碼,因此加密數據庫憑據並不會給您帶來太大的影響。

您的Web應用程序應使用最小權限用戶連接到數據庫,因此,破壞Web服務器應該只授予您讀取和更新數據的權限。 如果一切都通過Web服務層,那將如何改變? 同樣,通過訪問Web服務層,存在非常實際的成本 - 復雜性和性能。 只有客戶才能回答這個成本是否值得。

如果這是一個Web項目,則需要將運行用戶的IIS服務器更改為域用戶,並將sql server的權限授予該用戶。 您可以在連接字符串上使用SSPI,如下所示。 像這樣,您無需在web.config上清楚地保留您的用戶名或密碼。

<configuration>
  <system.web>
    <identity impersonate="true"/> 

  </system.web>

和你的connectionString

"Integrated Security=SSPI;Initial Catalog=TestDb;Data Source=10.10.10.10"

許多客戶都在爭論IT專業人員的工作,就像有很多人去看醫生要求用葯而不是他們有什么疾病,因為他們已經知道了答案,因為他們在互聯網上閱讀了這個問題。

我的意思是,他們要求您構建應用程序,並且當您的應用程序按預期工作時,您作為IT專業人員應該最了解。 你作為一個專業人士應該有球告訴你的客戶,如果他認為可以更好地到達其他地方,他應該去那里或者自己建立應用程序; 這是過去做的積極成果:)

關於安全; 或許為了他們的信心,你可以加密web.config並顯示它們,但實際上它沒有任何意義; 如果有人可以訪問服務器,他們可以解碼它。 另一方面,想要侵入您的數據庫的人應該通過很多障礙。 很難打破,也許是不可能的。 另一個選擇是簡單地阻止來自外部網絡的連接,網絡或ip范圍或其他任何東西 我認為這不應該是值得擔心的事情。

需要擔心的還有更多現實問題,例如防止跨站點腳本和此類常見問題。

客戶端錯誤引入另一層不會自動提高安全性。

簡而言之,使用SQL服務器角色進行數據訪問,例如內置的data_reader和data_writer角色是一個很好的起點。 始終為應用程序使用最合適的最小權限帳戶。 如果您只需要讀取數據,請使用只有讀取權限的帳戶。

盡可能使用Windows身份驗證,如果不可能,則至少加密連接字符串。

有關如何執行我所描述的操作的更多信息,請訪問http://msdn.microsoft.com/en-us/library/ff650037.aspx#pagpractices0001_dataaccess

一種可能性是加密web.config中的部分。 因此,只有能夠直接訪問Web服務器的用戶才能解密此部分。

以下是iisreg工具的幫助: http//msdn.microsoft.com/en-us/library/zhhddkxy.aspx

您可以在數據庫中啟用加密連接並告訴客戶端連接是否已加密以便完全安全?

為了使其更安全並滿足您的客戶,您可以在計算機之間使用隧道

您設置了數據庫所在的服務器隧道程序,以及客戶端計算機上的客戶端隧道程序。 您通過隧道將一台計算機連接到另一台計算機,並且數據庫連接通過隧道連接進行。

一切都是交換高安全性(如果隧道支持它,則壓縮)。

http://en.wikipedia.org/wiki/Tunneling_protocol

http://en.wikipedia.org/wiki/HTTP_tunnel

Ps我只通過隧道連接到我的服務器。

我從不喜歡使用網絡配置。 注冊表更安全。

最佳實踐是:

  • 隱藏注冊表中連接字符串的重要項
  • 加密連接中的重要項目,如注冊表中的用戶名,密碼和服務器名稱
  • 通過類訪問注冊表
  • 只在每頁需要時動態構建連接字符串
  • 錯誤處理每個頁面,以便在出現錯誤時不顯示連接字符串
  • 完成后始終關閉連接。 避免內存泄漏
  • 始終關閉並重置DataReaders

有關其他安全性

  • 您可以構建一個單獨的程序來創建連接字符串,並將該項目作為庫中的庫引用
  • 如果您想要真正安全,您的客戶是正確的。 將信息發送到將與DB通信的dll。 這是很多工作

資料來源:

來自ScottGu @ http://msdn.microsoft.com/en-us/library/Aa302406

可擴展性:

關於可伸縮性:使用自定義管理軟件可以非常輕松地在Web場中創建\\編輯注冊表項。

http://weblogs.asp.net/scottgu/archive/2010/09/08/introducing-the-microsoft-web-farm-framework.aspx

對所有投票給我的人的最后一點說明。 開箱即用的安全性還不夠。 安全是藝術,而不是科學。

黑客默認知道密碼存儲在哪里......

ASP.NET 4.0粉絲

Microsoft使asp.net 4.0網站可以輕松部署注冊表設置:

http://msdn.microsoft.com/en-us/library/dd394698.aspx

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM