[英]Best practices for using SqlCommand
我想確保在使用SqlCommand時,我正在使用最佳實踐,尤其是在安全性方面。
我不確定的注意事項:
如果您的第一個問題是談論通過直接包含值來構建SQL,那幾乎肯定不是一件好事。 它使您容易遭受SQL注入攻擊以及轉換問題(例如,必須獲取正確的日期/時間格式)。
相反,您應該使用參數化查詢 ,並在參數中設置值。 有關示例,請參見SqlCommand.Parameters
的文檔。
出於興趣,您是否有直接使用SQL而不是使用眾多ORM之一的特殊原因? (LLBL,實體框架,NHibernate,LINQ to SQL,SubSonic,Massive,SimpleData,Dapper ...)
我會說參數的使用是安全性最重要的方面之一。 這樣可以防止將SQL注入到數據庫中。 下面的SQLCommand是我將如何構造一個示例(在VB.NET中,抱歉,尚不具備C#知識;);)
Dim cmd as New SqlCommand("sp_StoredProcedure", Conn)
cmd.commandType = commandtypes.storedprocedure
cmd.parameters.add("@ID",sqldbtype.int).value = myID
cmd.executenonquery
內聯SqlCommand的示例:
Dim cmd as New SqlCommand("SELECT Name, Message FROM [Table] WHERE ID=@ID", Conn)
cmd.commandType = commandtypes.storedprocedure
cmd.parameters.add("@ID",sqldbtype.int).value = myID
cmd.executenonquery
我的建議:懶惰。 編寫大量代碼是犯人腦致命錯誤(錯誤的數據類型,空檢查,缺少的Dispose()等)的好方法,並且與許多輔助工具相比,它的性能優勢為零 。
就個人而言,我是小巧的狂熱愛好者(但我有些偏見),這使事情變得容易:
int customerId = ...
var orders = connection.Query<Order>(
@"select * from Customers where CustomerId = @customerId",
new { customerId });
它將為您輕松完成參數化和實現,而不會帶來痛苦。
對於其他情況,尤其是當您想使用OO技術來更新系統時,諸如EF或L2S之類的ORM將節省您的工作時間(並通過LINQ為您提供更好的類型檢查)。
我認為這是最好的解決方案
SqlConnection cn = new SqlConnection(strCn);
try
{
using (SqlCommand cmd = new SqlCommand("select * from xxxx", cn))
{
cn.Open();
//do something
cn.Close();
}
}
catch (Exception exception)
{
cn.Close();
throw exception;
}
取決於,當我進行POC或個人小型項目時,我通常會手動構建字符串,但是當我在一個正在工作的項目中時,我們有一個數據庫使用和連接模板,我必須使用該模板,而此處顯然無法透露。
但是我認為手動構建小型項目或POC中的基本操作是可以的。
如果您擔心安全性,建議您在SQL Server數據庫內部將查詢創建為存儲過程(以防止擔心SQL注入),然后從前端代碼中生成一個SQL存儲過程,添加參數,然后那樣做
這個文章應該幫助您與設置此功能。
您應該始終使用通過存儲過程與數據庫進行通信的方式,將最小特權應用於數據庫連接。
商店程序
using System.Data;
using System.Data.SqlClient;
using (SqlConnection connection = new SqlConnection(connectionString))
{
DataSet userDataset = new DataSet();
SqlDataAdapter myCommand = new SqlDataAdapter("LoginStoredProcedure", connection);
myCommand.SelectCommand.CommandType = CommandType.StoredProcedure;
myCommand.SelectCommand.Parameters.Add("@au_id", SqlDbType.VarChar, 11);
myCommand.SelectCommand.Parameters["@au_id"].Value = SSN.Text;
myCommand.Fill(userDataset);
}
數據庫連接字符串的憑據:A.公司/內聯網的集成安全性B.在注冊表或主機提供程序中的文件中對其進行加密。
始終注意黑客試圖將跨腳本上傳到您的表單中。
始終檢查輸入以進行SQL注入。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.