【问题标题】:Using quote delimiter in SQL SELECT statement for escaping single quote在 SQL SELECT 语句中使用引号分隔符来转义单引号
【发布时间】:2013-04-23 15:48:53
【问题描述】:

当用户在用 C# (.NET) 开发的表单条目中输入诸如“Sam 的项目可交付成果”之类的输入文本时,我想转义单引号。数据库是ORACLE 10g。

我遇到了 ORACLE 10g http://www.orafaq.com/wiki/SQL_FAQ#How_does_one_escape_special_characters_when_writing_SQL_queries.3F 提供的引号分隔符功能,但我不确定是否使用这样的引号分隔符 q'[ some text with single quote]' 作为 SELECT 语句的一部分会防止 SQL 注入攻击

引号分隔符q'[带单引号的文本]'的示例用法:

SQL> SELECT q'[Frank's Oracle site]' AS text FROM DUAL;
 TEXT
 -------------------
 Frank's Oracle site

 SQL> SELECT q'[A 'quoted' word.]' AS text FROM DUAL;
 TEXT
 ----------------
 A 'quoted' word.

 SQL> SELECT q'[A ''double quoted'' word.]' AS text FROM DUAL;
 TEXT
 -------------------------
 A ''double quoted'' word.

【问题讨论】:

  • 你的问题是......?
  • @MarcB:抱歉,Marc 在发布问题时遇到了一些问题。现在我的帖子应该解释我的问题/疑问
  • 它不会阻止注射。它可能会减慢半心半意的尝试,因为攻击者会假设结束分隔符是 ' 并且无处可去。但是专业人士不会止步于此,他们可以很容易地破坏引用文字。
  • 否 - 这不会阻止注入攻击。唯一可以防止注入攻击的是永远不要在 SQL 文本中直接使用用户输入的数据构建动态 SQL 语句;即始终通过参数标记访问用户输入的数据。万能!!!

标签: sql oracle oracle10g


【解决方案1】:

如果您的查询看起来像这样......

query = "SELECT * FROM Users WHERE name = q'[" + <what the user entered> + "]'";

...用户输入类似这样的内容...

abc]';<harmful statement>;SELECT * FROM DUAL WHERE '1'=q'[1

...他们会成功注射。

q 使用的分隔符无关紧要 - 坚定的攻击者会尝试所有这些分隔符。准备好的陈述是你最好的辩护。

【讨论】:

  • +1 感谢您的回答。您的回复帮助我了解了 q 分隔符的脆弱程度。
【解决方案2】:

在执行 SQL 之前,尝试将所有单引号替换为 2 个单引号。即在执行 SQL 命令之前将 ' 替换为 ''。

在 C# 中:

string sql = originalString.Replace("'", "''");

【讨论】:

  • 如果可以的话,使用参数化查询会更安全。
  • @Martyn:感谢您的回答。我只是想探索使用引号分隔符 q'[ ]' 的选项以及它有多安全?如果它可以防止注射?
  • @penguat:感谢您的链接和建议。我会调查的。
  • 我明白了。这篇文章可能比我能提供的帮助更多 - stackoverflow.com/questions/3544484/…
  • 否 - 我相信参数化查询将带有占位符的查询发送到数据库,然后用户输入以填充占位符。尝试搜索“c# oracle 参数化查询示例
猜你喜欢
  • 2018-12-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-31
  • 1970-01-01
  • 1970-01-01
  • 2019-09-08
  • 2015-06-16
  • 1970-01-01
相关资源
最近更新 更多