为什么我们总是喜欢在SQL语句中使用参数?
我对使用数据库非常陌生。现在我可以写SELECT
,UPDATE
,DELETE
,和INSERT
命令。但是我看过很多我们喜欢写的论坛:
SELECT empSalary from employee where salary = @salary
…代替:
SELECT empSalary from employee where salary = txtSalary.Text
为什么我们总是喜欢使用参数,我将如何使用它们?
我想知道第一种方法的用途和好处。我什至听说过SQL注入,但是我不太了解。我什至不知道SQL注入是否与我的问题有关。
-
当数据库与程序界面(例如桌面程序或网站)结合使用时,使用参数有助于防止 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。使用参数非常简单:
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的评论,我将示例代码更改为not use
AddWithValue
。另外,通常建议您将IDisposable
s包装在using
语句中。