首页 文章

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

提问于
浏览
285

我有一张 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 回答

  • 7

    通过加倍单引号 ' - > '' 是标准方式并且当然有效 .

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

    在旧版本中或者如果您仍然使用standard_conforming_strings = off运行,或者通常,如果您使用 E 前缀字符串来声明Posix转义字符串语法,则还可以使用反斜杠 \ 进行转义:

    E'user\'s log'
    

    但这通常不是优选的 .
    如果你必须处理许多单引号或多层转义,你可以避免使用dollar-quoted strings在PostgreSQL中引用地狱:

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

    为了进一步避免美元引用之间的混淆,请为每对添加唯一标记:

    $token$escape ' with ''$token$
    

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

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

    如果 $ 字符在客户端软件中具有特殊含义,请注意 . 你可能还要逃避它 . 对于像psql或pgAdmin这样的标准PostgreSQL客户端,情况并非如此 .

    这对于编写plpgsql函数或ad-hoc SQL命令非常有用 . 但是,当用户输入可用时,它无法减少使用预准备语句或其他方法来防止应用程序中的SQL注入的需要 . @Craig's answer有更多内容 . 更多细节:

  • 1

    在postgresql中,如果你想在其中插入 ' 的值,那么你必须提供额外的 '

    insert into test values (1,'user''s log');
     insert into test values (2,'''my users''');
     insert into test values (3,'customer''s');
    
  • 40

    你可以使用postrgesql chr(int)函数:

    insert into test values (2,'|| chr(39)||'my users'||chr(39)||');
    
  • 15

    如果你需要在Pg内完成工作:

    to_json(value)

    https://www.postgresql.org/docs/9.3/static/functions-json.html#FUNCTIONS-JSON-TABLE

  • 3

    这是一个很糟糕的世界,因为你的问题意味着你的应用程序中可能存在大量漏洞 .

    您应该使用参数化语句 . 对于Java,请使用PreparedStatement with placeholders . 你说你不能解释原因,坦率地说,不必使用它们是一个很好的理由,因为它们是解决你试图解决的问题最简单,最安全的方法 .

    Preventing SQL Injection in Java . 不要被Bobby的下一个受害者 .

    PgJDBC中没有用于字符串引用和转义的公共函数 . 这部分是因为它可能使它看起来像一个好主意 .

    PostgreSQL中有内置引用函数 quote_literalquote_ident ,但它们适用于使用 EXECUTEPL/PgSQL 函数 . 这些天 quote_literal 大多被 EXECUTE ... USING 淘汰,这是参数化版本,因为它更安全,更容易 . 您不能将它们用于此处解释的目的,因为它们是服务器端功能 .


    想象一下如果从恶意用户那里获得值 ');DROP SCHEMA public;-- 会发生什么 . 你会产生:

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

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

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

    哎呀,有你的数据库 .

  • 546

    根据PostgreSQL documentation (4.1.2.1. String Constants)

    To include a single-quote character within a string constant, write two 
     adjacent single quotes, e.g. 'Dianne''s horse'.
    

    另请参阅standard_conforming_strings参数,该参数控制是否使用反斜杠进行转义 .

相关问题