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

2024-01-11

我听说“每个人”都在使用参数化 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 http://www.sommarskog.se/dynamic_sql.html


The EXEC问题中的例子NOT被参数化。您需要参数化查询(在某些圈子中是准备好的语句)来防止这样的输入造成损坏:

';删除表栏;--

尝试将其放入您的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 之外的所有权限),并通过这种方式获得一些保护。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 将 SQL 数据中的一行映射到 Java 对象

    我有一个 Java 类 其实例字段 以及匹配的 setter 方法 与 SQL 数据库表的列名相匹配 我想优雅地从表中获取一行 到 ResultSet 中 并将其映射到此类的实例 例如 我有一个 Student 类 其中包含实例字段 FNA
  • SQL Server 用分隔符分割字符串

    我有一个输入字符串 100 2 3 101 2 1 103 2 3 我想解析它并将其添加到具有 3 列的表中 因此它应该是 f x col1 col2 col3 100 2 3 类似的其他数据以逗号分隔作为记录和 作为列 Thanks ni
  • PHP 绑定“bigint”数据类型(MySQLi 准备好的语句)

    studentId 57004542323382 companyOfferId 7 sql INSERT INTO studentPlacement companyOfferId studentId VALUES if stmt db gt
  • 复选框上的数据绑定

    我目前正在将数据从 SQL 数据库之一提取到我的应用程序中 我可以让它适用于我的文本框和其他项目 但是 我似乎无法让它适用于复选框 这是我正在使用的代码 DataTable dt new DataTable dt using SqlConn
  • 如何在 SQL Server 中使用 nvarchar 变量为 unicode 用户添加前缀“N”?

    如何在 SQL Server 中使用 nvarchar 变量为 unicode 用户添加前缀 N 例如 给定这个变量 declare Query1 nvarchar max 我可以这样分配它 set Query1 N 但是如果我想使用怎么办
  • SQL 删除表并重新创建并保留数据

    在我们最初的设计中 我们搞砸了表中的外键约束 现在表已充满数据 我们无法在不删除表中所有记录的情况下更改它 我能想到的唯一解决方案是创建一个备份表并将所有记录放在那里 然后删除所有记录 更改表并开始将它们添加回来 还有其他 更好 的想法吗
  • 插入触发器最终在分区表中插入重复行

    我有一个分区表 我认为 适当的INSERT触发器和一些限制 不知何故 INSERT语句为每个语句插入 2 行INSERT 一个用于父分区 一个用于相应的分区 设置简要如下 CREATE TABLE foo id SERIAL NOT NUL
  • 独立对列进行排序,使得所有空值都位于每列的最后

    这是一个名为的示例表animal name color fox brown fox red dog gold 现在 我想要的是这样的结果 fox dog brown gold red 名称应该是结果的列 不同颜色值作为行 我的第一个想法是
  • 使用 where 进行 select 语句时,HSQLDB 用户缺乏权限或未找到对象错误

    我的数据库使用 SQuirrel SQL 客户端版本 3 5 3 和 HSQLDB 我已经能够为其指定相应的驱动程序 内存中 并创建一个别名 我创建了一个表 CREATE TABLE ENTRY NAME VARCHAR 100 NOT N
  • 如何从 PostgreSQL 中的时间戳列值提取一天中的时间(或小时)?

    我正在尝试从 PostgreSQL 中的 时间戳 列中提取一天中的时间 这是我的做法 但是 太糟糕了 知道如何做得更好吗 SELECT date part hour date demande text hours date part min
  • PHP 通过 SSL 连接到 MS SQL

    我想要实现的目标非常简单 我想通过安全连接从 PHP 脚本连接到外部 MS SQL 数据库 然而 这已被证明是有问题的 到目前为止 经过三个小时的研究 我不知所措 客户端的平台是Ubuntu 这意味着我无法使用SQLSRV 安全连接已经在不
  • 如何 md5 所有列(无论类型如何)

    我想创建一个 sql 查询 或 plpgsql 它将 md5 所有给定的行 无论类型如何 但是 在下面 如果 1 为空 则哈希为空 UPDATE thetable SET hash md5 accountid accounttype cre
  • C# 的最佳替代“错误继续下一步”是什么?

    如果我为 C 代码放置空的 catch 块 它是否与 VB NET 的 On Error Resume Next 语句等效 try C code catch exception 我问这个问题的原因是因为我必须将 VB NET 代码转换为 C
  • SELECT 语句会受到 SQL 注入攻击吗?

    实际上有2个问题 我知道我必须尽可能多地使用存储过程 但我想知道以下内容 A 我可以从 SELECT 语句 例如 Select from MyTable 获得 SQL 注入攻击吗 B 另外 当我在 ASP NET 中使用 SQLDataSo
  • 自加入表

    我有一张像这样的桌子 Employee name salary a 10000 b 20000 c 5000 d 40000 我想获取所有工资高于A工资的员工 我不想使用任何嵌套或子查询 在采访中被问及并暗示是使用自连接 我真的不知道如何实
  • SQL不允许表中有重复记录

    如何使其不添加重复项 我想让它通过 ID 之外的所有其他列进行检查 我希望这个无效 ID col1 col2 col3 1 first middle last ID col1 col2 col3 2 first middle last 我希
  • SQL - != 'NULL' 的解释

    我的SSMS代码如下 Select top 50 From FilteredContact Where statuscode 1 and emailaddress1 NULL and telephone1 NULL and address1
  • MS ACCESS 计数/求和行数,不重复

    我有下表 我需要计算总行数而不包括任何重复记录 CustomerID test1 test1 test2 test3 test4 test4 如您所见 总行数为 6 但有两个 test1 和两个 test4 我希望查询返回 4 IOW 我想
  • 索引数量越少意味着插入、更新和删除速度更快? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在 String.Format 中插入格式化字符?

    我用谷歌搜索了这个 但 VB Net 2008 似乎不允许在 String Format 中插入格式化字符 例如 t r n BAD MessageBox Show String Format 0 tab 1 Foo Bar BAD Mes

随机推荐

  • ANTLR2 与 ANTLR3

    您使用过其中一个或两者吗 您更喜欢哪一个 出于什么原因 例如 我最近学习了 v2 并且由于 netbeans 团队提供的高性能实现 是的 我被 java 困住了 我可能会坚持使用它 在这种情况下 是否有任何令人信服的理由进行转换 要了解 v
  • 加密 SQL 连接字符串 C#

    我创建了一个连接到 sql 2005 服务器的 C 应用程序 不是 asp 网页 在我的源代码中 该 sql 服务器的密码和用户 ID 在 ConnectionString 中以纯文本形式编码 SqlConnection con new S
  • 使用 Parallel.ForEach() 线程安全吗?

    本质上 我正在处理这个 var data input AsParallel List
  • Gson用不同的数据解析相同的密钥

    如何解析服务器接收到的包含不同键值的数据 location id 1 id 2 and location id 1 不确定如何处理以下对象 public class UserLocation SerializedName location
  • 要求关联类型可以在 @convention(c) 块中表示

    我想要一种通用的方法来做类似 Swift 3 的事情 public protocol Callable associatedtype In CVarArg associatedtype Out CVarArg public struct I
  • 如何让 Twitter 引导日期选择器与 Meteor 一起使用?

    我宁愿使用 Bootstrap 的 Meteor 包实现 而不是文件较少的版本 但我很难让日期选择器工作 似乎有处于不同状态的三个版本 最后一个版本由 Aymkdn 编译并准备就绪 http www eyecon ro bootstrap
  • 如何将 JSON 数据加载到 A-Frame 组件中?

    将自定义 JSON 文件作为数据加载到 A 框架组件中的最佳方法是什么 例如 JSON 文件可能包含点的坐标 我想将文件作为资产加载并在组件中使用解析后的 json 对象 coordinates x 0 y 1 z 2 You can 在架
  • XSL:有没有一种简单的方法可以防止寡妇?

    我本来希望打电话
  • Android Studio 错误:无法解析 Xml 中的符号

    我正在关注 google Android Studio 第一个 Android 应用程序教程 但是当我尝试向我的应用程序添加搜索栏时 我现在遇到了 3 个奇怪的错误 我现在就在这里 就像教程一样添加了 XML 代码 http develop
  • 在随机坐标数组中使用 CollideRect

    现在 我的游戏正确地将所有图像传输到随机位置 并且也正确获取图像的矩形 但我不知道如何使用 colliderect 来确保图像不重叠 它如何适用于我的代码 另外 我试图让第一个文本淡出 但我不知道为什么它对我不起作用 这是代码 class
  • 在 Angular2 应用程序中运行 ng 服务时出现错误“无法读取未定义的属性‘长度’”

    使用 angular cli 命令 ng serve 运行 angular2 应用程序时 我遇到以下问题 电子邮件受保护 cdn cgi l email protection启动 C Users padmavathi Downloads p
  • 如何向 AVPlayerViewController 添加自定义按钮?

    有没有什么方法可以将 向后 前进跳过 30 分钟 按钮添加到子类 AVPlayerViewController 中 使其看起来像原生的 就像播放 暂停按钮一样 实际上没有 好的 方法可以做到这一点 Apple 保持 AVPlayerView
  • 为什么切片值有时会过时但永远不会映射值?

    我发现切片映射函数和通道经常被一起提到参考类型 但是我注意到切片某些东西没有表现出任何参考行为 就像它们可能会变得陈旧一样 var s int must update slice value s append s or must use p
  • iOS LinkedIn 身份验证

    我开始使用 Swift 开发 iOS 应用程序 现在我需要创建一个登录系统 然而 我们需要人们提供的 LinkedIn 信息 如何在 iOS 中使用 OAuth2 API 来实现此目的 我已经在 LinkedIn 开发人员区域创建了一个应用
  • 如果集合中已存在临时元素,是否允许“[unordered_]set::emplace()”不构造临时元素?

    这个答案 https stackoverflow com a 77245073 2752075指出了一些有趣的事情 一个天真的实现std unordered set
  • 参数中的 Java“new”关键字

    最近我研究了很多 OOP 设计模式 遇到了一些以前从未见过的奇怪的事情 Button button new Button shell SWT PUSH button addSelectionListener new SelectionAda
  • 跨平台改变java进程优先级的方法

    我需要在单独的 JVM 中与另一个 java 应用程序调用 jar 文件 它非常消耗 CPU 因此它应该以后台优先级运行 以免影响系统的其余部分 有没有跨平台的方法来做到这一点 简单的答案是 没有可移植的方法来更改 Java 中进程的优先级
  • 无法解析方法,为什么?

    方法setDateListener DateListener dl 无法解决 它是公共的 我在包含该方法的 DatePickerFragment java 类的对象上使用它 这里是onCreateView 片段中的方法setDateList
  • C++ 刷新缓冲区

    我知道这里有很多缓冲区问题 但我似乎找不到明确的答案 std cout lt lt write to screen lt lt std endl 我知道这段代码会因为 endl 而写入屏幕并刷新缓冲区 但如果我这样写 std cout lt
  • 如何创建参数化 SQL 查询?我为什么要?

    我听说 每个人 都在使用参数化 SQL 查询来防止 SQL 注入攻击 而不必验证每一条用户输入 你怎么做到这一点 使用存储过程时会自动获取此信息吗 所以我的理解这是非参数化的 cmdText String Format SELECT foo