为了账号安全,请及时绑定邮箱和手机立即绑定

在PostgreSQL中插入带有单引号的文本

在PostgreSQL中插入带有单引号的文本

繁星coding 2019-06-09 15:21:32
在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转义机制?
查看完整描述

3 回答

?
开满天机

TA贡献1786条经验 获得超13个赞

转义单引号'把它们翻一番->''当然,这是标准的方式和工作方式。

'user's log'     -- incorrect syntax (unbalanced quote)
'user''s log'

在旧版本中,或者如果您仍然运行standard_conforming_strings = off或者,通常情况下,如果您用E宣布POSIX转义字符串语法,您也可以使用反斜杠逃跑。\:

E'user\'s log'

但这通常并不可取。
如果您必须处理多个单引号或多层转义,则可以避免在PostgreSQL中引用地狱美元引号:

'escape '' with '''''$$escape ' with ''$$

为了进一步避免美元报价之间的混淆,在每对单引号上添加一个唯一的标记:

$token$escape ' with ''$token$

可以嵌套任意数量的级别:

$token2$Inner string: $token1$escape ' with ''$token1$ is nested$token2$

注意如果$字符在您的客户端软件中应该有特殊的含义。你可能还得逃离它。对于psql或pgAdmin这样的标准PostgreSQL客户端,情况并非如此。

这对于编写plpgsql函数或即席SQL命令非常有用。但是,它不能减轻使用准备好的语句或其他方法来防止在您的应用程序中进行SQL注入的需要,因为用户输入是可能的。@Craig的回答会有更多的报道。更多详情:


查看完整回答
反对 回复 2019-06-09
?
繁花不似锦

TA贡献1851条经验 获得超4个赞

这是很多不好的世界,因为你的问题意味着你可能有裂口。SQL注入你申请表上的漏洞。

您应该使用参数化语句。对于Java,请使用PreparedStatement带占位符..你说你不想使用参数化语句,但你没有解释为什么坦率地说,这必须是一个非常好的理由不使用它们,因为它们是最简单、最安全的方法来解决您正在试图解决的问题。

看见防止Java中的SQL注入..别这样鲍比下一个受害者。

PgJDBC中没有用于字符串引用和转义的公共函数。这在一定程度上是因为它可能会让人觉得这是个好主意。

那里内置引号函数quote_literalquote_ident在PostgreSQL中,但是它们是PL/PgSQL使用EXECUTE..这几天quote_literal大多被淘汰EXECUTE ... USING,也就是参数化版本,因为它是更安全更容易..您不能将它们用于这里解释的目的,因为它们是服务器端函数。


想象一下,如果你得到了这个值,会发生什么?');DROP SCHEMA public;--来自恶意用户。你会产生:

insert into test values (1,'');DROP SCHEMA public;--');

它分解为两个语句和一个被忽略的注释:

insert into test values (1,'');DROP SCHEMA public;--');

喔,你的数据库来了。


查看完整回答
反对 回复 2019-06-09
  • 3 回答
  • 0 关注
  • 4509 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信