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

如何创建参数化的SQL查询?我为什么要?

甘永春
2023-03-14
问题内容

我听说“每个人”都在使用参数化的SQL查询来防止SQL注入攻击,而不必验证用户的每一项输入。

你怎么做到这一点?使用存储过程时,是否会自动获得此信息?

所以我的理解是非参数化的:

cmdText = String.Format("SELECT foo FROM bar WHERE baz = '{0}'", fuz)

可以将其参数化吗?

cmdText = String.Format("EXEC foo_from_baz '{0}'", fuz)

还是我需要像这样做一些更广泛的事情,以保护自己免受SQL注入的侵害?

With command
    .Parameters.Count = 1
    .Parameters.Item(0).ParameterName = "@baz"
    .Parameters.Item(0).Value = fuz
End With

除了安全方面的考虑之外,使用参数化查询还有其他优势吗?

更新:这篇很棒的文章与Grotok引用的问题之一相关联。
http://www.sommarskog.se/dynamic_sql.html


问题答案:

您的EXEC示例将不会被参数化。您需要参数化的查询(有些情况下是准备好的语句),以防止类似这样的输入引起损坏:

’; DROP TABLE栏;-

尝试将其放在您的fuz变量中(如果您重视bar表,则不要这样做)。更细微和破坏性的查询也是可能的。

这是有关如何使用Sql Server执行参数的示例:

Public Function GetBarFooByBaz(ByVal Baz As String) As String
    Dim sql As String = "SELECT foo FROM bar WHERE baz= @Baz"

    Using cn As New SqlConnection("Your connection string here"), _
        cmd As New SqlCommand(sql, cn)

        cmd.Parameters.Add("@Baz", SqlDbType.VarChar, 50).Value = Baz
        Return cmd.ExecuteScalar().ToString()
    End Using
End Function

存储过程有时可以防止SQL注入。但是,大多数时候您仍然必须使用查询参数来调用它们,否则它们将无济于事。如果
使用存储过程,则可以关闭应用程序用户帐户的SELECT,UPDATE,ALTER,CREATE,DELETE等权限(除了EXEC之外,几乎所有其他权限),并以此方式获得一些保护。



 类似资料:
  • 问题内容: 我问这个问题有点傻,因为我似乎是世界上唯一一个不了解这个问题的人,但是无论如何,这都是可行的。我将以Python为例。当我使用原始SQL查询(通常使用ORM)时,我会使用参数化,例如使用SQLite的以下示例: 方法A: 我知道这可行,我知道这是通常推荐的方式。SQL注入易受攻击的方式可以执行以下操作: 方法B: 到目前为止,我可以告诉我了解SQL注入,如本Wikipedia文章中所述

  • 我想在Select&Create table语句中向查询提供运行时值。参数化Athena SQL查询的方法有哪些?我尝试了从Presto中使用和语句,但它在Athena控制台中不起作用。我们需要任何像Python这样的外部脚本来调用它吗?

  • 问题内容: 什么是参数化查询?在PHP和MySQL中,这种查询的示例是什么? 问题答案: 参数化查询(也称为 预处理语句)是预编译SQL语句的一种方法,因此您需要提供的只是需要插入语句中的“参数”(认为“变量”)即可。被执行。它通常用作防止SQL注入攻击的手段。 您可以在PHP的PDO页面(PDO是数据库抽象层)上阅读有关这些内容的更多信息,但是如果您使用的是mysqli数据库接口,也可以使用它们

  • 我开始了解axiosendpoint,我想知道为什么我们要对endpoint使用查询参数? 谷歌表示,我们之所以使用它,是因为它“有助于检索特定数据,并根据用户传递的输入执行操作” 我相信有一个“过滤”函数可以用来过滤响应,我假设我们可以使用查询参数来做类似的事情,但我不确定它们是否就是这个意思。我创建了一个客户机和服务器示例,在该示例中,我将查询参数传递给服务器,服务器返回一个带有我发送的参数的

  • 下面包含一个本机查询,我需要在其中设置一个参数,但是由于没有设置参数,所以该查询是错误的 所以返回所有行。怎么了

  • 问题内容: 有什么方法可以创建 查询参数 以在JavaScript中执行 GET请求 吗? 就像在Python中一样,它具有一个字典(或两个元组的列表)并创建一个类似的字符串。 问题答案: 干得好: 用法: