我有一张 table 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转义机制?
6 回答
通过加倍单引号
'
- >''
是标准方式并且当然有效 .在旧版本中或者如果您仍然使用standard_conforming_strings = off运行,或者通常,如果您使用
E
前缀字符串来声明Posix转义字符串语法,则还可以使用反斜杠\
进行转义:但这通常不是优选的 .
如果你必须处理许多单引号或多层转义,你可以避免使用dollar-quoted strings在PostgreSQL中引用地狱:
为了进一步避免美元引用之间的混淆,请为每对添加唯一标记:
哪个可以嵌套任意数量的级别:
如果
$
字符在客户端软件中具有特殊含义,请注意 . 你可能还要逃避它 . 对于像psql或pgAdmin这样的标准PostgreSQL客户端,情况并非如此 .这对于编写plpgsql函数或ad-hoc SQL命令非常有用 . 但是,当用户输入可用时,它无法减少使用预准备语句或其他方法来防止应用程序中的SQL注入的需要 . @Craig's answer有更多内容 . 更多细节:
在postgresql中,如果你想在其中插入
'
的值,那么你必须提供额外的'
你可以使用postrgesql chr(int)函数:
如果你需要在Pg内完成工作:
to_json(value)
https://www.postgresql.org/docs/9.3/static/functions-json.html#FUNCTIONS-JSON-TABLE
这是一个很糟糕的世界,因为你的问题意味着你的应用程序中可能存在大量漏洞 .
您应该使用参数化语句 . 对于Java,请使用PreparedStatement with placeholders . 你说你不能解释原因,坦率地说,不必使用它们是一个很好的理由,因为它们是解决你试图解决的问题最简单,最安全的方法 .
见Preventing SQL Injection in Java . 不要被Bobby的下一个受害者 .
PgJDBC中没有用于字符串引用和转义的公共函数 . 这部分是因为它可能使它看起来像一个好主意 .
PostgreSQL中有内置引用函数
quote_literal
和quote_ident
,但它们适用于使用EXECUTE
的PL/PgSQL
函数 . 这些天quote_literal
大多被EXECUTE ... USING
淘汰,这是参数化版本,因为它更安全,更容易 . 您不能将它们用于此处解释的目的,因为它们是服务器端功能 .想象一下如果从恶意用户那里获得值
');DROP SCHEMA public;--
会发生什么 . 你会产生:分解为两个语句和一个被忽略的注释:
哎呀,有你的数据库 .
根据PostgreSQL documentation (4.1.2.1. String Constants):
另请参阅standard_conforming_strings参数,该参数控制是否使用反斜杠进行转义 .