在PostgreSQL中用单引号插入文本
我有一个表test(id,name)
。
我需要插入的值如: user's log
, 'my user'
, customer's
。
insert into test values (1,'user's log'); insert into test values (2,''my users''); insert into test values (3,'customer's');
如果我运行上述任何一个语句,则会出现错误。
如果有任何方法正确地做到这一点,请分享。 我不想要任何准备好的陈述。
是否有可能使用sql转义机制?
通过翻倍单引号'
''
是当然的标准方式和作品。
'user's log' 'user''s log'
在旧版本中,或者仍然使用standard_conforming_strings = off
运行,或者通常,如果用E
预先声明string以声明Posix转义string语法 ,则也可以使用反斜杠\
:
E'user\'s log'
但这通常不是可取的。
如果你必须处理很多单引号或者多层转义,你可以避免在PostgreSQL中用美元引用的string引用地狱:
'escape '' with ''''' $$escape ' with ''$$
为了进一步避免美元报价中的混淆,请在您的美元报价中添加或多或less的独特标记:
$token$escape ' with ''$token$
它可以嵌套任何级别:
$token2$Inner string: $token$escape ' with ''$token$ is nested$token2$
请注意,如果$
字符在客户端软件中应该有特殊含义。 你可能不得不逃脱它。 标准的PostgreSQL客户端,例如psql或pgAdmin,情况并非如此。
这对编写plpgsql函数或ad-hoc SQL命令非常有用。 尽pipe如此,它不能缓解使用预处理语句或其他方法防止SQL注入的需要。 @克雷格的答案有更多的。 更多细节:
- Postgres函数与准备查询中的SQL注入
这是如此之多的糟糕的世界,因为你的问题意味着你可能在你的应用程序中有很大的SQL注入漏洞。
你应该使用参数化语句。 对于Java,使用带占位符的PreparedStatement
。 你说你不想使用参数化语句,但是你不能解释为什么 ,而坦率地说它不应该是一个很好的理由不使用它们,因为它们是解决你所尝试的问题的最简单,最安全的方法解决。
请参阅防止Java中的SQL注入 。 不要成为鲍比的下一个受害者。
PgJDBC没有公共职能来进行string引用和转义。 这部分是因为它可能使它看起来像一个好主意。
PostgreSQL中有内置的引用函数quote_literal
和quote_ident
,但是它们是使用EXECUTE
PL/PgSQL
函数。 现在, quote_literal
大部分已经被EXECUTE ... USING
废弃,这是参数化的版本 ,因为它更安全 , 更简单 。 你不能将它们用于你在这里解释的目的,因为它们是服务器端的function。
想象一下,如果你得到这个值,会发生什么');DROP SCHEMA public;--
来自恶意用户。 你会产生:
insert into test values (1,'');DROP SCHEMA public;--');
分解为两个语句和一个被忽略的注释:
insert into test values (1,''); DROP SCHEMA public; --');
哎呀,那里有你的数据库。
根据PostgreSQL文档(4.1.2.1。string常量) :
To include a single-quote character within a string constant, write two adjacent single quotes, eg 'Dianne''s horse'.
另请参阅standard_conforming_strings参数,该参数控制是否使用反斜杠进行转义。
在postgresql中,如果你想插入值,那么你必须给予额外的'
insert into test values (1,'user''s log'); insert into test values (2,'''my users'''); insert into test values (3,'customer''s');