如何在oracle中预测和转义单引号'

Posted

技术标签:

【中文标题】如何在oracle中预测和转义单引号\'【英文标题】: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 时我的客户端脚本将失败 【参考方案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 之类的输入

以上是关于如何在oracle中预测和转义单引号'的主要内容,如果未能解决你的问题,请参考以下文章

shell中单引号怎么转义

oracle怎样转义单引号

oracle怎样转义单引号

oracle怎样转义单引号

如何在oracle中插入含有半角单引号'的字符串

Oracle 语句如何转义