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#
Trả lời
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();
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
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
Đây là bạn học cũ – Dilberted
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.
Không bao giờ đi xuống con đường nhib quá nhiều cấu hình cần thực hiện. – Dilberted
@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
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);
Điều này có nghĩa là gì, chính xác? –
Đã cập nhật câu trả lời. –
Cảm ơn bạn, Oleg –
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 ..
Giải pháp đơn giản nhất là linq2sql .. Không có truy vấn SQL nào được viết – Dilberted
Đơ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} –
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();
}
}
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.
- 1. Các truy vấn multiline sql-injection có an toàn không?
- 2. Cách tạo truy vấn động và an toàn
- 3. tạo truy vấn sql trong C++/java?
- 4. Cách sử dụng * làm thẻ hoang dã trong truy vấn SQL an toàn
- 5. Tránh viết các truy vấn SQL hoàn toàn trong SSIS
- 6. Cách tạo một biến tĩnh an toàn
- 7. Tạo các số ngẫu nhiên một cách an toàn trong mục tiêu-C
- 8. Tôi làm cách nào để thực hiện các truy vấn Xpath loại an toàn trong Java?
- 9. Loại an toàn, Java Generics và truy vấn
- 10. SQL - AN TOÀN xuống một cách an toàn BIGINT thành INT
- 11. Cách thoát khỏi các truy vấn SQL đơn giản trong C# cho SqlServer
- 12. Tạo chuỗi dữ liệu an toàn trong C#
- 13. Truy vấn Dapper LIKE cho MySql an toàn với Sql Injection?
- 14. Các truy vấn mysql động có thoát sql cũng an toàn như các câu lệnh đã chuẩn bị chưa?
- 15. Chuỗi truy vấn trong lệnh SQL C#
- 16. Cách tạo bảng bằng truy vấn chọn trong SQL Server?
- 17. Truy vấn PDO của tôi có an toàn khỏi việc tiêm SQL không
- 18. tạo std :: chuỗi từ char * một cách an toàn
- 19. Sử dụng 'HttpContext.Current.Cache' một cách an toàn
- 20. Cách tạo chủ đề an toàn EntityManagerFactory?
- 21. Chủ đề có thể được tạo một cách an toàn trong khi khởi tạo tĩnh không?
- 22. Cách tạo tập lệnh tạo bảng bằng truy vấn SQL trong SQL Server
- 23. Những ký tự nào không an toàn trong chuỗi truy vấn?
- 24. C# Chủ đề an toàn nhanh (est) truy cập
- 25. Truy vấn tham số SQL trong Android
- 26. An toàn loại an toàn()
- 27. cách tối ưu để tạo ra các truy vấn SQL chèn dài với PDO
- 28. SQL Server Tạo một bảng temp cho truy vấn này
- 29. Cách tạo truy vấn tìm kiếm sql mạnh mẽ hơn?
- 30. Marks Exclamation trong một truy vấn SQL
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