2012-02-24 17 views
12

Cách an toàn nhất để tạo các truy vấn SQL trong C#, bao gồm việc làm sạch đầu vào của người dùng để nó an toàn khi tiêm? Tôi đang tìm cách sử dụng một giải pháp đơn giản mà không cần thư viện bên ngoài.Tạo các truy vấn SQL một cách an toàn trong C#

+1

một số tệp 1 "thư viện bên ngoài" có thể làm cho điều đó rất đơn giản, như Dapper hoặc PetaPoco – Guillaume86

Trả lời

17

Sử dụng Sql Tham số:

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparameter(v=vs.80).aspx

Dưới đây là một ví dụ trong C#

SqlCommand tCommand = new SqlCommand(); 
tCommand.Connection = new SqlConnection("YourConnectionString"); 
tCommand.CommandText = "UPDATE players SET name = @name, score = @score, active = @active WHERE jerseyNum = @jerseyNum"; 

tCommand.Parameters.Add(new SqlParameter("@name", System.Data.SqlDbType.VarChar).Value = "Smith, Steve"); 
tCommand.Parameters.Add(new SqlParameter("@score", System.Data.SqlDbType.Int).Value = "42"); 
tCommand.Parameters.Add(new SqlParameter("@active", System.Data.SqlDbType.Bit).Value = true); 
tCommand.Parameters.Add(new SqlParameter("@jerseyNum", System.Data.SqlDbType.Int).Value = "99"); 

tCommand.ExecuteNonQuery(); 
+0

Tham số SQL là một cách tuyệt vời để bắt đầu. Nếu ứng dụng bắt đầu phát triển và cần phải thực hiện rất nhiều cuộc gọi SQL, có thể là thời gian để xem LINQ hoặc ORM của một số loại. – NickHeidke

+0

Tôi chấp thuận (và personaly sử dụng rất nhiều LINQ-to-SQL), nhưng tôi không thực sự coi nó là một giải pháp đơn giản (bạn phải hiểu triết lý DataContext để tránh một số sai lầm), nhưng như tôi đã nói trong phần bình luận một số người trợ giúp nhỏ ra khỏi đó để xây dựng các truy vấn parametrized mà tôi sẽ sử dụng thay vì sử dụng trực tiếp các lớp SqlClient. – Guillaume86

+0

Đây là bạn học cũ – Dilberted

0

Sử dụng DBMLLINQ để xử lý nó cho bạn. Nhiều người đã làm việc với những người đó để đảm bảo những vấn đề đó được giảm nhẹ.

Và nếu không ít nhất là tham số truy vấn của bạn.

1

Nguyên tắc đầu tiên của ngón tay cái là để đảm bảo bạn sử dụng tham số truy vấn/lệnh. Về cơ bản không xây dựng động một chuỗi sql bao gồm thứ gì đó mà người dùng đã nhập vào trang.

Nếu bạn sử dụng trên ORM (EF, L2S, Nhib), điều này thường được xử lý trong hầu hết các trường hợp vì hầu hết tất cả đều chạy truy vấn được tham số hóa.

+0

Không bao giờ đi xuống con đường nhib quá nhiều cấu hình cần thực hiện. – Dilberted

+0

@Dilberted: Tôi sử dụng NHib rất nhiều. Đó là một chút khó khăn để bắt đầu, nhưng nó thực sự trả hết trong cuộc đời của một ứng dụng lớn. Đó là một sản phẩm tốt hơn so với EF/L2S cho các dự án phức tạp hơn. – swannee

1

Tham số truy vấn của bạn.

Trong trường hợp nếu bạn xây dựng một số TSQL trong đó xây dựng một số TSQL động khác - then use some described technique

gì "parametrizing nghĩa

Xem, không sử dụng một cái gì đó như thế này:

sqlCommand.CommandText = "select * from mytable where id = "+someVariable; 

sử dụng này? :

sqlCommand.CommandText = "select * from mytable where id = @id"; 
sqlCommand.Parameters.AddWithValue("@id", someVariable); 
+0

Điều này có nghĩa là gì, chính xác? –

+0

Đã cập nhật câu trả lời. –

+0

Cảm ơn bạn, Oleg –

0

Tên riêng cho DBML là linq2sql hoặc một phiên bản nâng cao được gọi là khung thực thể. Các công nghệ này được cung cấp bởi Microsoft và được tích hợp tốt với studio trực quan. Không yêu cầu thư viện bổ sung.

Sản phẩm khá ổn định ..

+0

Giải pháp đơn giản nhất là linq2sql .. Không có truy vấn SQL nào được viết – Dilberted

+0

Đơn giản? Như thế này. từ usr trong dc.Users tham gia ug trong dc.UserGroups trên usr.UserID bằng ug.UserID tham gia gr trong dc.Group trên ug.GroupID bằng gr.PkID chọn new {usr, gr} –

1

Sử dụng truy vấn được yêu cầu.

Ví dụ đơn giản.

var sql = "SELECT * FROM MyTable WHERE MyColumn = @Param1"; 
using (var connection = new SqlConnection("...")) 
using (var command = new SqlCommand(sql, connection)) 
{ 
    command.Parameters.AddWithValue("@Param1", param1Value); 
    return command.ExecuteReader(); 
} 

Ví dụ chi tiết hơn.

protected void btnGoodAddShipper_Click(object sender, EventArgs e) 
{ 
    string connStr = c 
     "Server=(local);Database=Northwind;Integrated Security=SSPI"; 

    // this is good because all input becomes a 
    // parameter and not part of the SQL statement 
    string cmdStr = 
     "insert into Shippers (CompanyName, Phone) values (" + 
     "@CompanyName, @Phone)"; 

    using (SqlConnection conn = new SqlConnection(connStr)) 
     using (SqlCommand cmd = new SqlCommand(cmdStr, conn)) 
     { 
      // add parameters 
      cmd.Parameters.AddWithValue 
       ("@CompanyName", txtCompanyName.Text); 
      cmd.Parameters.AddWithValue("@Phone", txtPhone.Text); 

      conn.Open(); 
      cmd.ExecuteNonQuery(); 
     } 
} 
3

Về bản chất không làm điều này

SqlCommand command = new SqlCommand(MyConnection); 
command.CommandText = "Select * From MyTable Where MyColumn = '" + TextBox1.Text + "'" 
... 

làm

SqlCommand command = new SqlCommand(MyConnection); 
command.CommandText = "Select * From MyTable Where MyColumn = @MyValue"; 
command.Parameters.AddWithValue("MyValue",TextBox1.Text); 
... 

Về cơ bản không bao giờ xây dựng lệnh sql của bạn trực tiếp từ người dùng nhập vào.

Nếu bạn sử dụng ORM, chẳng hạn như EntityFrameworks/POCO, tất cả truy vấn được thực hiện ở dạng sau.

Các vấn đề liên quan