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

我可以通过使用单引号转义单引号和周围的用户输入来防止SQL注入吗?

丁景山
2023-03-14
问题内容

我意识到在构建包含用户输入的查询时,参数化SQL查询是清理用户输入的最佳方法,但是我想知道使用用户输入并转义任何单引号并将整个字符串都用单引号引起来是怎么回事。这是代码:

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

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

我们使用的是Microsoft SQL Server
2000,我相信单引号是唯一的字符串定界符,也是避免字符串定界符的唯一方法,因此无法执行用户键入的任何内容。

我看不到有什么方法可以发起针对此的SQL注入攻击,但是我意识到,如果这在我看来像防弹一样,那么其他人可能已经想到了,并且这将是普遍的做法。

此代码有什么问题?有没有办法使SQL注入攻击超越这种清理技术?利用此技术的样本用户输入将非常有帮助。

更新:

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

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

我知道有更好的方法可以清除输入,但是我真的更感兴趣于了解为什么我上面提供的方法行不通。如果有人知道针对此清理方法发起SQL注入攻击的任何特定方式,我很乐意看到它。


问题答案:

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

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

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

即使这些情况不适用于您,这仍然不是一个好主意。而且,除非您的应用很小,否则您将不得不进行维护,也许还要进行一定量的管理:如何确保始终无处不在正确地执行它?

正确的方法是:

  • 白名单验证:类型,长度,格式或可接受的值
  • 如果您想将其列入黑名单,请继续。引号转义是好的,但要在其他缓解措施的范围内。
  • 使用命令和参数对象进行准备和验证
  • 仅调用参数化查询。
  • 更好的是,仅使用存储过程。
  • 避免使用动态SQL,并且不要使用字符串连接来构建查询。
  • 如果使用SP,则还可以将数据库中的权限限制为仅执行所需的SP,而不能直接访问表。
  • 您还可以轻松地验证整个代码库仅通过SP访问数据库…


 类似资料:
  • 我需要帮助在postgresql insert中转义单引号。我正在使用ETL工具从源中提取数据并加载到postgresql数据库中。Select语句包含一些变量。 例如,我的选择查询是 变量的值为。这句话给了我一个错误 而不是被加载到postgres表中。谁能帮我分析单引号,我应该如何在变量中使用单引号?

  • 问题内容: 我有一个正在编写的脚本,用于将某些字段移至新的数据库,例如 但是如您所见,由于单引号和双引号,查询每次都会中断,是否有解决此问题的方法,例如herdok或类似的东西 问题答案: 为此而制作的。 PHP:mysql_real_escape_string

  • 我正在使用opencsv读取csv文件。有时csv文件中包含单引号或双引号。如何读取它们而不更改csv文件本身中的数据。 现在,如果我用两个单引号替换一个单引号,它工作正常,与双引号相同,用两个替换单个引号,它的工作原理。但我不想碰源文件。 要访问的代码如下: 这样做的结果是跳过下一行(也包含双引号),插入所有奇数行,跳过偶数行 提前谢谢

  • 问题内容: 我现在很困惑,想知道,如果您能为我解决问题。 在最新的Anon / Lulsec攻击之后,我开始质疑php / mysql的安全性。 所以,我想,我该如何保护PHP和Mysql。 问题:谁能向我解释,关于引号,处理PHP和Mysql的 最佳实践 是什么? 尤其是在表单中,为了保护html,我需要某种htmlspecialchars,对吗? 可以使用表单完全利用PHP吗?是否需要任何保护

  • 问题内容: 这是需要执行的代码块: 此块用Java代码形成。在执行时,这将引发异常 org.springframework.jdbc.BadSqlGrammarException 。但是当我更改为它时,执行成功。 这是我的问题: 1)为什么在我使用单引号时会引发异常? 2)单引号和双引号“单引号”有什么区别? 3)如果我始终使用双“单引号”,会不会有任何后果? 问题答案: 从Oracle文档中获取

  • 问题内容: 我该如何工作? 将在引起此故障。我从类似的文件运行它,但也无法从命令行运行。我试过使用and 和(unicode ) 我被卡住了 问题答案: 我有同样的问题。最简单的解决方案是,除了用单引号引起来的撇号外,还要使用反斜杠来将其引起来。 对于您的用例,更改为,它应该可以工作。 另一种方法是将POST数据()用双引号引起来,同时用反斜杠转义JSON字符串中所有嵌套的双引号。