我可以通过转义单引号并用单引号包围用户输入来防止 SQL 注入吗?

2024-01-04

我意识到参数化 SQL 查询是在构建包含用户输入的查询时清理用户输入的最佳方法,但我想知道获取用户输入并转义任何单引号并用单引号包围整个字符串有什么问题。这是代码:

sSanitizedInput = "'" & Replace(sInput, "'", "''") & "'"

用户输入的任何单引号都会替换为双单引号,这消除了用户结束字符串的能力,因此他们可能输入的任何其他内容(例如分号、百分号等)都将成为字符串的一部分,并且实际上并未作为命令的一部分执行。

我们使用的是 Microsoft SQL Server 2000,我相信单引号是唯一的字符串分隔符,也是转义字符串分隔符的唯一方法,因此无法执行用户输入的任何内容。

我没有看到任何方法可以针对此问题发起 SQL 注入攻击,但我意识到,如果这像我认为的那样万无一失,那么其他人可能已经想到了它,并且这将是常见的做法。

这段代码有什么问题?有没有办法让 SQL 注入攻击绕过这种清理技术?利用此技术的示例用户输入将非常有帮助。


UPDATE:

我仍然不知道有什么方法可以有效地针对此代码发起 SQL 注入攻击。一些人建议反斜杠可以转义一个单引号并保留另一个来结束字符串,以便字符串的其余部分将作为 SQL 命令的一部分执行,我意识到这种方法可以将 SQL 注入到MySQL 数据库,但在 SQL Server 2000 中(我已经找到的)转义单引号的唯一方法是使用另一个单引号;反斜杠不会这样做。

除非有一种方法可以阻止单引号的转义,否则用户输入的其余部分都不会被执行,因为它们都将被视为一个连续的字符串。

我知道有更好的方法来清理输入,但我真的更感兴趣的是了解为什么我上面提供的方法不起作用。如果有人知道针对这种清理方法发起 SQL 注入攻击的任何具体方法,我很乐意看到它。


首先,这只是不好的做法。输入验证总是必要的,但它也总是不确定的。
更糟糕的是,黑名单验证总是有问题的,最好明确并严格地定义您接受的值/格式。诚然,这并不总是可能的——但在某种程度上它必须始终做到。
关于该主题的一些研究论文:

  • http://www.imperva.com/docs/WP_SQL_Injection_Protection_LK.pdf http://www.imperva.com/docs/WP_SQL_Injection_Protection_LK.pdf
  • http://www.it-docs.net/ddata/4954.pdf http://www.it-docs.net/ddata/4954.pdf(披露,最后一个是我的;))
  • https://www.owasp.org/images/d/d4/OWASP_IL_2007_SQL_Smuggling.pdf https://www.owasp.org/images/d/d4/OWASP_IL_2007_SQL_Smuggling.pdf(基于之前的论文,该论文已不再可用)

要点是,您所做的任何黑名单(以及过于宽松的白名单)都可以被绕过。我论文的最后一个链接显示了甚至可以绕过引用转义的情况。

即使这些情况不适用于您,但这仍然是一个坏主意。此外,除非您的应用程序非常小,否则您将不得不处理维护问题,也许还需要进行一定程度的治理:如何确保它在任何时候、任何地方都正确执行?

正确的做法是:

  • 白名单验证:类型、长度、格式或接受的值
  • 如果您想列入黑名单,请直接进行。引用转义是好的,但要在其他缓解措施的背景下进行。
  • 使用命令和参数对象来准备和验证
  • 仅调用参数化查询。
  • 更好的是,专门使用存储过程。
  • 避免使用动态 SQL,并且不要使用字符串连接来构建查询。
  • 如果使用 SP,您还可以将数据库中的权限限制为仅执行所需的 SP,而不直接访问表。
  • 您还可以轻松验证整个代码库仅通过 SP 访问数据库...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我可以通过转义单引号并用单引号包围用户输入来防止 SQL 注入吗? 的相关文章

随机推荐

  • 根据相似度对图像进行聚类

    我面临着基于相似性的图像聚类问题 而不知道聚类的数量 理想情况下 我想实现类似这样的目标http cs231n github io assets cnnvis tsne jpeg http cs231n github io assets c
  • 无法解析相应的jni函数

    我正在制作一个通过串口发送数据的应用程序 这需要从本机库调用方法 我有两个本机方法 打开 关闭 我使用 ndk 生成了 so 库并将它们放入 jnilibs 文件夹中 但仍然给出错误 无法解析相应的 jni 函数 串口 c include
  • 如何使这种组合/排列方法递归?

    我有一个字符串数组列表 希望将所有可能的组合存储到另一个集合中 例如 air bus car gt air bus car air bus air car bus air bus car car air car bus air bus ca
  • 如何监视另一个应用程序的数据库的更改?

    我想监视另一个应用程序 SQLite 数据库的更改 由于 Android 不允许我访问其他应用程序的内部数据 因此我需要一个根应用程序 这正是我的应用程序 有没有办法可以监视系统上文件的更改并在我的应用程序中触发事件 我用谷歌搜索了一下 看
  • jQuery 颜色选择器推荐 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我需要非常轻的 jquery 颜色选择器插件 它允许用户将鼠标拖动到色轮上 并能够选择透明颜色 或 空白 无 有什么建议么 我从谷歌得到了
  • 如何简洁地编写包含数据框中许多变量的公式?

    假设我有一个响应变量和一个包含三个协变量的数据 作为玩具示例 y c 1 4 6 d data frame x1 c 4 1 3 x2 c 3 9 8 x3 c 4 4 2 我想对数据进行线性回归 fit lm y d x1 d x2 d
  • 如何在当前机器上运行jvm

    想象一下 两个 java 项目在 JDK1 5 和 JDK1 6 上运行 其中两个是在 JDK 1 7 上工作的 如何获取正在运行的jvm名称 pid和项目名称就可以了 结果应该是这样的 pid 1234 projec tname prj1
  • iOS:失去蓝牙连接

    我成功地使用蓝牙连接了 iPhone 和 Mac iPhone 是中心 Mac 是外围 连接后 两者可以通信 iPhone 订阅了 Mac 宣传的一些特性 但是 一段时间 随机 之后 iPhone 的蓝牙图标变灰 并且 iPhone 不再接
  • 调用未定义的方法 Illuminate\Foundation\Application::bindShared()

    我刚刚将 Laravel 从 5 0 升级到 5 1 我收到此错误 Call to undefined method Illuminate Foundation Application bindShared 因此 经过一番搜索后 我需要将b
  • 内置变量中的可变默认参数

    我们都知道 可怕的可变默认参数 https stackoverflow com questions 1132941 least astonishment and the mutable default argument 我惊讶地发现至少有一
  • 使用非 SQL 数据库是否就无需防范“SQL 注入”?

    这似乎是一个显而易见 或不那么明显 的问题 但让我解释一下 我正在使用 Google 的数据库技术 BigTable 编写 Google App Engine 网站 任何 App Engine 程序员都会知道 Google 有自己的有限查询
  • 在 Git Web hook 之后重新启动 Plesk 17.5 上的 Node 应用程序

    目前 我在 Plesk 17 5 中的一个非常基本的 NodeJS 服务器上设置了自动 Git 部署 问题是 如果我推送新的提交 我需要手动登录 Plesk 仪表板并单击 重新启动应用程序 否则更改不会生效 我尝试添加npm start作为
  • 关于在画布上显示照片是否存在已知的 Win32 Tkinter 错误?

    我注意到 tkinter 有一个非常奇怪的错误 我想知道这是否是因为 python 与 tcl 交互的方式有问题 至少在 Win32 中是这样 这里我有一个超级简单的程序 可以显示 gif 图像 它工作完美 from Tkinter imp
  • 如何将优先级升级到log4j-2?

    我正在尝试将 log4j 升级到 log4j2 我尝试升级的特定代码行是 log targetClass Priority DEBUG INT message null 静态场Priority DEBUG INT在新版本中不再可用Prior
  • NoSuchMethodError:在 null 上调用了方法“ancestorStateOfType”

    我正在像这样的 iam 流列表那样进行屏幕更改 当它发出时我会更改屏幕 override void initState super initState appBloc error listen data scaffoldKey curren
  • 我可以将资产文件夹中的文件移动到资产子文件夹中吗?

    我的资产文件夹中有一个文件 当我按下程序中的按钮时 我必须将该文件移动到子文件夹 运行时 中 能做到吗 我必须这样做 资产 文件 txt gt 资产 aaa 文件 txt 不会 您的资源会被编译到您的 apk 文件中 考虑存储一个持久的首选
  • F# 元组类型的模式匹配

    我有一个柯里化函数 我希望它支持不同类型的参数 这些参数不具有继承关系 type MyType1 A B of float type MyType2 C D of int 我试图做的是 let func x y match x y with
  • 使 git 输出所有命令的完整(未缩写)哈希值?

    问题更新 注意 我已经接受了罗兰的回答 因为它确实是正确的 并且 最简单 从 git 1 7 4 4 开始的解决方案 但请考虑这个问题 打开有关 git 低至 1 7 0 4 的早期版本的信息 这个问题有点漫无目的 主要是由于我的编辑造成的
  • 如果使用 jquery 检查单选按钮,则启用输入字段

    我在 html 代码中有这个单选按钮 span span
  • 我可以通过转义单引号并用单引号包围用户输入来防止 SQL 注入吗?

    我意识到参数化 SQL 查询是在构建包含用户输入的查询时清理用户输入的最佳方法 但我想知道获取用户输入并转义任何单引号并用单引号包围整个字符串有什么问题 这是代码 sSanitizedInput Replace sInput 用户输入的任何