使用参数有助于防止SQL注入攻击,特别是当数据库与程序接口(如桌面程序或网站)一起使用时。
在您的示例中,用户可以通过在txtSalary
中构建语句来直接在您的数据库上运行SQL代码。
例如,如果他们写0 OR 1=1
,则执行的SQL将是
SELECT empSalary from employee where salary = 0 or 1=1
从中可以返回所有员工薪资。
此外,如果用户输入 0; Drop Table employee
等更糟糕的命令,可能会对您的数据库造成不良影响,包括删除它。
SELECT empSalary from employee where salary = 0; Drop Table employee
接下来会删除表employee
。
在您的情况下,看起来您正在使用.NET。使用参数非常简单:
string sql = "SELECT empSalary from employee where salary = @salary";
using (SqlConnection connection = new SqlConnection(/* connection info */))
using (SqlCommand command = new SqlCommand(sql, connection))
{
var salaryParam = new SqlParameter("salary", SqlDbType.Money);
salaryParam.Value = txtMoney.Text;
command.Parameters.Add(salaryParam);
var results = command.ExecuteReader();
}
Dim sql As String = "SELECT empSalary from employee where salary = @salary"
Using connection As New SqlConnection("connectionString")
Using command As New SqlCommand(sql, connection)
Dim salaryParam = New SqlParameter("salary", SqlDbType.Money)
salaryParam.Value = txtMoney.Text
command.Parameters.Add(salaryParam)
Dim results = command.ExecuteReader()
End Using
End Using
编辑时间 2016-4-25:
根据George Stocker的评论,我更改了示例代码,不再使用AddWithValue
。同时,通常建议将IDisposable
对象包装在using
语句中。
Insert Into table (Col1, Col2) Values (@Col1, @Col2)
。在您的代码中,您需要添加多个AddWithValue
。 - Chad Levyparameter.Value = someValue
添加参数值。 - George StockerOdbcConnection
而不是 SQL? - LuckyLikeysalaryParam.Value = CDec(txtMoney.Text)
:SQL Server 中的money
在 .NET 中是Decimal
类型:SQL Server 数据类型映射。参数名称需要加上“@”,例如“@salary”。 - Andrew Morton