【问题标题】:How to anticipate and escape single quote ' in oracle如何在oracle中预测和转义单引号'
【发布时间】:2014-12-09 07:01:18
【问题描述】:

假设我有一个列值为aaa'gh,它会在 oracle 中抛出错误,说 sql 命令没有正确结束。

我的问题是,如果我不知道我的值中有多少 ',我该如何安全地逃脱它们。

【问题讨论】:

  • 逃避你将要做什么。
  • 请在 google 上搜索“Oracle 中的转义字符”。 www.dba-oracle.com/tips_oracle_escape_characters.htm
  • @Exhausted 我有一个从数据库中获取的变量。当该变量中包含' 时,它会产生问题。嗨,AK47,当我手头有价值时,我知道如何逃跑。假设我不知道值是什么?
  • 您正在选择一个变量,您将使用它来构建动态 SQL 来执行?然后,如果变量包含',动态 SQL 会失败?如何使用绑定变量来包含变量内容而不是将其连接到动态 SQL 字符串中?这样就不需要转义,也没有 SQL 注入的机会,也不会用许多独特的语句杀死共享池。 (当然取决于您的实际用例 - 在某些情况下绑定变量解决方案是不可能的,但我们无法从您的描述中看出 ;-)
  • 嗨,Kim,这里是基于客户端的脚本语言和 oracle 之间的通信。更准确地说,我正在使用一个 shell 脚本,在该脚本中我将此列值作为参数传递,从而调用我的客户端脚本。在客户端脚本中,我正在调用 oracle sql 并使用此列值来获取某些内容。在此获取过程中,如果我的列具有此 ' 值,则尝试执行此 sql 时我的客户端脚本将失败

标签: sql oracle


【解决方案1】:

最好的方法是使用quoting string literal technique。语法为q'[...]',其中“[”和“]”字符可以是以下任意字符,只要它们尚未出现在字符串中即可。

  • [ ]​​i>
  • { }
  • ( )

您不必担心字符串中的单引号。

假设我的列值为 aaa'gh

所以您可以简单地将 SQL 编写为,

SELECT q'[aaa'gh]' FROM DUAL;

它为开发人员节省了大量时间。我们(开发人员)过去在开发数据库中使用 dbms_output 验证动态 sql 的日子已经一去不复返了,只是为了在投入生产之前确保一切就绪。

【讨论】:

  • 这是关于“q-quoting”的文档:docs.oracle.com/cd/B19306_01/server.102/b14200/…
  • 我认为这不能解决问题。如果用户输入的是aaa]'gh,仍然执行失败,仍然可以进行SQL注入。
  • @jgosar 这些被称为特殊字符是有原因的,这与某些字符和关键字在 Oracle 或任何软件中保留或特殊的原因相同。当您设计应用程序并希望用户输入一个值时,您肯定需要对输入进行验证。例如,如果我想输入姓名,我不应该允许 !@#$%^&*()。为了避免 SQL 注入,最好使用绑定变量。答案完全解决了 OP 的问题,并且同样被接受了。
【解决方案2】:

我解决这个问题的简单方法总是使用

replace(string, '''', '''''')

但 Lalit Kumar B 解决方案似乎更复杂

【讨论】:

  • 实际上,新的文字引用技术为开发人员节省了大量时间 :-) 我们开发人员过去在开发数据库中使用 dbms_output 检查动态 sql 以确保事情正常的日子已经一去不复返了在投入生产之前就位。
  • 这实际上比接受的答案更好,因为它正确处理诸如 abc'de 和 abc]'de 之类的输入
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-07-28
  • 2011-11-22
  • 1970-01-01
  • 2011-01-03
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
相关资源
最近更新 更多