MAH*_*AHI 377 postgresql quotes insert special-characters
我有一张桌子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');
Run Code Online (Sandbox Code Playgroud)
如果我运行上述任何语句,我会收到错误.
如果有任何方法可以正确地做到这一点请分享.我不想要任何准备好的陈述.
是否可以使用sql转义机制?
Erw*_*ter 679
'
通过将单引号加倍来逃避单引号- > ''
是标准方式并且当然有效.
'user's log' -- incorrect syntax (unbalanced quote)
'user''s log'
Run Code Online (Sandbox Code Playgroud)
在旧版本中或者如果您仍然使用standard_conforming_strings = off
或运行,通常,如果您使用前缀E
来声明Posix转义字符串语法,您也可以使用反斜杠转义\
:
E'user\'s log'
Run Code Online (Sandbox Code Playgroud)
但这通常不是优选的.
如果你必须处理许多单引号或多层转义,你可以避免使用美元引用的字符串在PostgreSQL中引用地狱:
'escape '' with '''''
$$escape ' with ''$$
Run Code Online (Sandbox Code Playgroud)
为了进一步避免美元引用之间的混淆,请为每对添加唯一标记:
$token$escape ' with ''$token$
Run Code Online (Sandbox Code Playgroud)
哪个可以嵌套任意数量的级别:
$token2$Inner string: $token1$escape ' with ''$token1$ is nested$token2$
Run Code Online (Sandbox Code Playgroud)
如果$
角色在客户端软件中具有特殊含义,请注意.你可能不得不逃避它.对于像psql或pgAdmin这样的标准PostgreSQL客户端,情况并非如此.
这对于编写plpgsql函数或ad-hoc SQL命令非常有用.但是,当用户输入可用时,它无法减少使用预准备语句或其他方法来防止应用程序中的SQL注入的需要.@ Craig的回答有更多.更多细节:
Cra*_*ger 42
这是一个很糟糕的世界,因为你的问题意味着你的应用程序中可能存在大量的SQL注入漏洞.
您应该使用参数化语句.对于Java,请PreparedStatement
与占位符一起使用.你说你不想使用参数化语句,但你不解释原因,坦率地说,它不是一个很好的理由不使用它们,因为它们是解决你正在尝试的问题的最简单,最安全的方法解决.
请参阅在Java中防止SQL注入.不要成为鲍比的下一个受害者.
PgJDBC中没有用于字符串引用和转义的公共函数.这部分是因为它可能会让它看起来像个好主意.
有是内置的报价功能quote_literal
和quote_ident
PostgreSQL中,但它们对于PL/PgSQL
使用功能EXECUTE
.这些日子quote_literal
大多被淘汰EXECUTE ... USING
,这是参数化版本,因为它更安全,更容易.您不能将它们用于此处解释的目的,因为它们是服务器端功能.
想象一下,如果您');DROP SCHEMA public;--
从恶意用户那里获得价值,会发生什么.你会产生:
insert into test values (1,'');DROP SCHEMA public;--');
Run Code Online (Sandbox Code Playgroud)
分为两个语句和一个被忽略的注释:
insert into test values (1,'');
DROP SCHEMA public;
--');
Run Code Online (Sandbox Code Playgroud)
哎呀,有你的数据库.
Cla*_*dix 19
根据PostgreSQL文档(4.1.2.1.字符串常量):
To include a single-quote character within a string constant, write two
adjacent single quotes, e.g. 'Dianne''s horse'.
Run Code Online (Sandbox Code Playgroud)
另请参见standard_conforming_strings参数,该参数控制是否使用反斜杠进行转义.
小智 8
在postgresql中,如果你想在其中插入值,'
那么你必须提供额外的'
insert into test values (1,'user''s log');
insert into test values (2,'''my users''');
insert into test values (3,'customer''s');
Run Code Online (Sandbox Code Playgroud)
小智 5
您可以使用postrgesql chr(int)函数:
insert into test values (2,'|| chr(39)||'my users'||chr(39)||');
Run Code Online (Sandbox Code Playgroud)