我对使用数据库非常陌生.现在我可以编写SELECTUPDATEDELETEINSERT个命令.但我见过很多我们更喜欢写的论坛:

SELECT empSalary from employee where salary = @salary

...而不是:

SELECT empSalary from employee where salary = txtSalary.Text

为什么我们总是喜欢使用参数,我将如何使用它们?

我想知道第一种方法的用途和好处.我甚至听说过SQL注入,但我并不完全理解它.我甚至不知道SQL注入是否与我的问题有关.

推荐答案

当数据库与程序界面(如桌面程序或网站)结合使用时,使用参数有助于防止SQL Injection attacks.

在您的示例中,用户可以通过在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.


在你的情况下,看起来你正在使用.网使用参数非常简单:

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的 comments ,我将示例代码更改为不使用AddWithValue.此外,一般建议您将IDisposable个语句包装在using个语句中.

Sql相关问答推荐

如何在VB.NET中使用MS SYS根据开始和结束期间日期进行查询

R中对Arrow duckdb工作流的SQL查询

在多个柱上连接时,如何确定连接条件?

防止ActiveRecord迁移在db/structure.sql中进行巨大更改

SQL SELECT MOST NEST TIMESTAMP BEAT ORDER

SQL子查询返回多个值错误

查询页面推荐

Pgsql-返回包含多行数据的行

Postgres jsonpath运算符的变量替换,如_regex?

Select 最频繁的值以及分组依据

显示所有组并计算给定组中的项目(包括 0 个结果)

如何根据 SQL 中的阈值标记一个集群中的所有值?

确定小数中使用的精度位数

为什么在事务中未被后续使用的CTE执行SELECT...FOR UPDATE无效?

Set vs let vs 在snowflake中声明变量

SQL Server 分区和 Run Case 语句

PlSql 陷入死循环

如何根据另一列对行值进行分组?

snowfalke 会在 Select 运行时锁定表吗?

如果当前日期是一周中的某一天,则从另一天提取结果