Hei*_*nzi 44 c# sql vb.net ado.net sql-injection
我试图使用用户提供的数据创建一个SQL语句.我在C#中使用与此类似的代码:
var sql = "INSERT INTO myTable (myField1, myField2) " +
"VALUES ('" + someVariable + "', '" + someTextBox.Text + "');";
var cmd = new SqlCommand(sql, myDbConnection);
cmd.ExecuteNonQuery();
Run Code Online (Sandbox Code Playgroud)
这在VB.NET中:
Dim sql = "INSERT INTO myTable (myField1, myField2) " &
"VALUES ('" & someVariable & "', '" & someTextBox.Text & "');"
Dim cmd As New SqlCommand(sql, myDbConnection)
cmd.ExecuteNonQuery()
Run Code Online (Sandbox Code Playgroud)
然而,
O'Brien)时,这会失败,我怎么做"正确的方式"?
Hei*_*nzi 50
使用参数化SQL.
例子
(这些示例在C#中,请参阅下面的VB.NET版本.)
用@...占位符替换字符串连接,然后将值添加到SqlCommand.您可以自由选择占位符的名称,只需确保它们以@符号开头即可.您的示例如下所示:
var sql = "INSERT INTO myTable (myField1, myField2) " +
"VALUES (@someValue, @someOtherValue);";
using (var cmd = new SqlCommand(sql, myDbConnection))
{
cmd.Parameters.AddWithValue("@someValue", someVariable);
cmd.Parameters.AddWithValue("@someOtherValue", someTextBox.Text);
cmd.ExecuteNonQuery();
}
Run Code Online (Sandbox Code Playgroud)
相同的模式用于其他类型的SQL语句:
var sql = "UPDATE myTable SET myField1 = @newValue WHERE myField2 = @someValue;";
// see above, same as INSERT
Run Code Online (Sandbox Code Playgroud)
要么
var sql = "SELECT myField1, myField2 FROM myTable WHERE myField3 = @someValue;";
using (var cmd = new SqlCommand(sql, myDbConnection))
{
cmd.Parameters.AddWithValue("@someValue", someVariable);
using (var reader = cmd.ExecuteReader())
{
...
}
// Alternatively: object result = cmd.ExecuteScalar();
// if you are only interested in one value of one row.
}
Run Code Online (Sandbox Code Playgroud)
需要注意的AddWithValue是:这是一个很好的起点,在大多数情况下都能正常工作.但是,传入的值需要与相应数据库字段的数据类型完全匹配.否则,您可能最终会遇到转换阻止查询使用索引的情况.请注意,某些SQL Server数据类型(如char/varchar(不带前面的"n")或日期)没有相应的.NET数据类型.在这些情况下,Add应使用正确的数据类型.
我为什么要那样做?
它更安全:它会停止SQL注入.(Bobby Tables不会删除您的学生记录.)
它更容易:无需使用单引号和双引号来查找或查找日期文字的正确字符串表示.
它更稳定:O'Brien不会因为他坚持保留他的奇怪名字而使你的应用程序崩溃.
其他数据库访问库
如果您使用OleDbCommand而不是SqlCommand(例如,如果您使用的是MS Access数据库),请使用?而不是@...SQL中的占位符.在这种情况下,第一个参数AddWithValue是无关紧要的; 相反,您需要以正确的顺序添加参数.OdbcCommand也是如此.
| 归档时间: |
|
| 查看次数: |
5439 次 |
| 最近记录: |