2013-07-30 101 views
2

我有一個關於SecureString作爲MySql連接器的連接字符串的一般問題。如果我理解正確,SecureStrings是在我的程序中存儲字符串的「安全」方式。現在我已經兩個問題與:MySQL SecureString作爲連接字符串

  1. 我在安裝時的密碼讀取(TextBox這是string,因此不安全)
  2. 我已經建立了使用mysql-connector連接字符串這是string(不安全再次)

例如:

MySqlConnection con = new MySqlConnection(); 
MySqlConnectionStringBuilder builder = new MySqlConnectionStringBuilder(); 
builder.Add("SERVER", "loaclhost"); 
builder.Add("PORT", "3306"); 
builder.Add("DATABASE", "test_db"); 
builder.Add("UID", "root"); 
builder.Add("PASSWORD", "11235813"); //not the real password ;) 
con.ConnectionString = builder.ConnectionString; 
con.Open(); 

這讓我想起我的下一個問題:MySQL的精讀nector API是「不安全的」,因爲所有值都以明文string存儲。

最後的問題:是否有使用SecureString

在我看來,我可以在我的程序中隨處使用string。如果談到MySQL,所有類型的加密(在我的程序中)都是沒用的。

我說得對嗎?還有其他方法嗎?

問候 亞歷

+0

[我什麼時候需要.NET中的SecureString?](http://stackoverflow.com/questions/141203/when-would-i-need-a-securestring-in-net) –

+0

該帖子年齡較大,但那裏有很好的信息。被接受的答案很好的解釋了爲什麼還要有'SecureString'_(「主要目的是減少攻擊面,而不是消除它」),並列出目前支持它的端到端(那裏可能是框架中的其他對象,現在也支持它...我不確定)。 –

+0

ty,我已經讀過。這不是真的解決我的問題。我正在使用WinForms(我將添加標籤),因此沒有密碼箱,我無法讀取密碼,因爲'SecureString'不支持該操作,並且MySQL-Connector使用多個字符串作爲密碼,connectionstring和等等。 – Alex

回答

1

還有其他的方法來做到這一點。這取決於你的連接字符串後你認爲誰來,以及他們將有什麼類型的訪問和技能水平。連接字符串在某處,無論您如何設法隱藏它。

由於知道連接字符串可能被黑客入侵,我總是認爲它會被黑客入侵,並在另一端採取預防措施。

我們在數據庫服務器端做了幾件事,以確保即使連接字符串被壓縮,數據仍然是安全的。

  • 與連接字符串關聯的用戶在服務器上的權限幾乎爲零。他們擁有的唯一權限是包含存儲過程的SCHEMA上的EXECUTE和CONTROL。
  • 前端的唯一訪問權限是通過存儲過程。我們絕不允許前端發送SQL字符串。
  • 數據被保存在一個獨立的模式中,而不是可執行文件,在DATA模式中,用戶與連接字符串關聯的用戶具有ZERO權限,他們不能看它,嗅到它或觸摸它。
  • 存儲過程將權限委託給具有足夠權限執行proc的非登錄用戶。 (WITH EXECUTE AS'no-login User')

這是關於我們所能做的一切。我們尚未找到阻止連接字符串以某種方式暴露的方法。

回覆Alex在下面問的問題。 (太長的評論)

注意。以下是MS SQL Server,它可能適用於其他DBMS系統,但我不能擔保其他任何人。

數據庫包含模式,模式包含數據庫對象,如表,視圖,存儲過程。例如,如果你有一組表允許任何人查看,然後他們可以進入COMMON模式,如果你有工資信息,你需要保護你可以把schmea放在數據庫對象的範圍內那到PAYROLL架構。然後,您可以根據其內部對象的類型對SCHEMA施加不同的安全措施。 Graphicaly看起來像硬盤上的文件夾,在它們下面是它們包含的所有數據庫對象。啓動服務器時,會創建幾個自動創建的模式。你最熟悉的是DBO schmea。如果您的管理員將其設置爲默認模式,您可能不會意識到這一點。

我們所做的是將所有數據放入一個數據schmea中,這意味着只允許使用表格。因此,如果我們有工資覈算數據庫,那麼數據表將進入名爲dataPayroll的模式。

存儲過程是數據庫服務器在調用時可以運行的塊或SQL代碼塊。它可以返回一個數據表,或一個單一的值。把它看作是C#中的一種方法。

存儲過程有輸入,並返回在SQL代碼中使用的參數。 Paramatarized Stored Procedures是針對SQL注入攻擊的強大防禦。

我們的協議規定存儲過程和視圖都存儲在一個以「prog」開頭的模式中。因此,在工資覈算數據庫中,所有不是數據的對象都在progPayroll模式中。

由連接字符串定義的用戶只對'prog'架構擁有控制權和執行權限。這使他們可以調用存儲過程。由連接字符串定義的用戶將被拒絕所有其他權限。此用戶在其他地方也被拒絕了所有權限。在存儲過程中,訪問數據的權限被委派給NO LOGIN用戶,該用戶有權使用EXECUTE AS命令從「數據」模式檢索數據。

前端沒有sql。所有前端程序員都知道存儲過程的名稱,參數以及返回類型和值。

這樣,即使攻擊者設法從您的程序中挑出連接字符串,他們仍然有很多工作要做,以便能夠對數據庫執行任何操作,因爲他們擁有的用戶只能執行存儲過程。

如果你不知道這些東西是什麼,那麼你真的需要一個DB程序員爲你設置你的系統。

+0

可以請你解釋兩點/字 1:'存儲過程'(vs ??不存儲??),2:'獨立模式比可執行文件' 我不知道他們的立場。 – Alex

+0

添加到我上面的答案中。 – Kassabba

+0

謝謝解釋。 – Alex