在PostgreSQL中把$放在有美元引号的字符串中[英] Put $$ in dollar-quoted string in PostgreSQL

本文是小编为大家收集整理的关于在PostgreSQL中把$放在有美元引号的字符串中的处理方法,想解了在PostgreSQL中把$放在有美元引号的字符串中的问题怎么解决?在PostgreSQL中把$放在有美元引号的字符串中问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我在Postgres中具有一个功能:

CREATE OR REPLACE FUNCTION upsert(sql_insert text, sql_update text) 
RETURNS integer AS
$BODY$
BEGIN
 EXECUTE sql_insert;
 RETURN 1;
EXCEPTION WHEN unique_violation THEN
 EXECUTE sql_update; 
 RETURN 2;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE
COST 100;
ALTER FUNCTION upsert(text, text) OWNER TO dce;

我通常使用此查询来调用该功能:

select upsert(
  $$INSERT INTO zz(a, b) VALUES (66, 'hahahaha')$$,
  $$UPDATE zz SET a=66, b='hahahaha' WHERE a=66$$
)

它有效.不幸的是,我的查询字符串不能包含$$,因此:

select upsert(
  $$INSERT INTO zz(a, b) VALUES (66, 'ha$$hahaha')$$,
  $$UPDATE zz SET a=66, b='hahahaha' WHERE a=66$$
)

我已经阅读了需要帮助如何做.

推荐答案

使用不同的美元报价而不是:

select upsert(
   $unique_token$INSERT INTO zz(a, b) VALUES (66, 'ha$$hahaha')$unique_token$,
   $unique_token2$UPDATE zz SET a=66, b='hahahaha' WHERE a=66$unique_token2$
   )

每个端都必须匹配每个启动.这两对不必不同,但是那样是最安全的.

这仍然留下了一个理论的机会,即美元引号可能在字符串中匹配.

如果您要手工构建查询,只需在字符串中检查$即可. 如果要从变量构建查询,则可以使用 quote_literal(querystring) 而不是.

还有方便的 inspergresql 中的单个引号插入文本

旁边:我假设您知道这种动态SQL非常容易受到SQL注入的影响吗?任何东西都应该是非常私人或非常安全的使用.

本文地址:https://www.itbaoku.cn/post/1763926.html