当数据库与程序界面(如桌面程序或网站)结合使用时,使用参数有助于防止SQL注入攻击。
在您的示例中,用户可以通过编写中的语句直接在数据库上运行SQL代码txtSalary
。
例如,如果他们要编写0 OR 1=1
,则执行的SQL将是
SELECT empSalary from employee where salary = 0 or 1=1
从而所有empSalaries都将被退回。
此外,用户可能会对您的数据库执行更差的命令,包括删除以下命令0; Drop Table employee
:
SELECT empSalary from employee where salary = 0; Drop Table employee
employee
然后将删除该表。
就您而言,您似乎正在使用.NET。使用参数非常简单:
C#
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();
}
VB.NET
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的评论,我将示例代码更改为not use AddWithValue
。另外,通常建议将IDisposable
s 包装在using
语句中。