当前位置: 首页 > 面试题库 >

为什么我们总是喜欢在SQL语句中使用参数?

宗政松
2023-03-14
问题内容

我对使用数据库非常陌生。现在我可以写SELECTUPDATEDELETE,和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。另外,通常建议您将IDisposables包装在using语句中。



 类似资料:
  • 我正在学习亚当·简斯的合唱团教程。 数据是用这个代码块加载的 而准备就绪被定义为 我把这个序列理解为 首先-创建一个名为promises的数组,其中第一项是来自此链接的已解析json,第二项是来自该文件的id/值对的映射 第二,获取promise变量中的所有promise,如果成功,则触发函数ready,如果失败,则不执行任何操作 如果这是对的,那么相对于这样的东西有什么优势呢?我用伪代码写这个因

  • 问题内容: 是否可以在一个查询中将多个SQL LIKE通配符串在一起-像这样? 目的是查找同时包含通配符但没有特定顺序的记录。 问题答案: 正确的SQL语法是:

  • 本文向大家介绍python中 这两个参数是什么意思:*args,**kwargs?我们为什么使用它们?相关面试题,主要包含被问及python中 这两个参数是什么意思:*args,**kwargs?我们为什么使用它们?时的应答技巧和注意事项,需要的朋友参考一下 如果我们不确定要往一个函数中传入多少参数,或者我们希望以元祖或者列表的形式传参数时,我们可以使用*args。如果我们不知道要往函数中传递多少

  • 问题内容: 我如何使用mysqli用LIKE进行查询并获得所有结果? 这是我的代码,但是不起作用: 此代码似乎不起作用。我已经搜索了很多。也可能返回多于1行。那么,即使返回的结果超过1行,我如何获得所有结果呢? 问题答案: 这是您正确获取结果的方式 或者,您也可以执行以下操作: 希望您意识到我从这里和这里的手册中直接得到了答案,这是您应该首先去的地方。

  • Javadoc说 返回一个收集器,该收集器将输入元素累加到一个新集合中。无法保证返回的集合的类型、可变性、可序列化性或线程安全性;如果需要对返回集进行更多控制,请使用toCollection(java.util.function.Supplier)。 所以似乎是一个避免出现问题的好主意。 我的问题是,尽管我尽了最大努力,我还是无法从中得到比 下面是我使用的代码: 那么,为什么Javadoc声明没有

  • 本文向大家介绍你最喜欢用哪些编辑器?喜欢它的理由是什么?相关面试题,主要包含被问及你最喜欢用哪些编辑器?喜欢它的理由是什么?时的应答技巧和注意事项,需要的朋友参考一下 vscode。可以灵活安装不同插件,真正做到了一个编辑器,适配所有的编程语言。 它和virtual stuido理念不同,vs是想把所有的都集成到一起,导致它的安装包越来越庞大,臃肿,而vscode凭借插件运行机制,即插即用,非常灵