簡體   English   中英

使用SqlCommand的最佳實踐

[英]Best practices for using SqlCommand

我想確保在使用SqlCommand時,我正在使用最佳實踐,尤其是在安全性方面。

我不確定的注意事項:

  1. 可以通過追加來手動構建字符串嗎? 如果沒有,我該怎么辦?
  2. 我應該使用什么類代替?

如果您的第一個問題是談論通過直接包含值來構建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中的基本操作是可以的。

  • 編輯:像喬恩所說,盡管在構建自己的命令時應始終使用類似SqlCommand.Parameters的方式。 對不起,如果我不清楚。

如果您擔心安全性,建議您在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.

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