如何安全地填充 pg_notify 有效负载?

use*_*081 3 postgresql json csv

数据通过准备好的语句和存储过程进入我的应用程序,所以我不太担心注入。当新用户注册时,我想发送一封激活电子邮件。目前我正在使用触发器和通知来执行此操作。它看起来像这样:

CREATE FUNCTION on_sign_up() RETURNS trigger as $$
  DECLARE
  BEGIN
    PERFORM pg_notify('sign_ups', NEW.user_id || ',' || NEW.email || ',' || NEW.activation_code);
    RETURN new;
  END;
$$ language plpgsql;

CREATE TRIGGER on_sign_up_trigger AFTER INSERT ON user_account
  FOR EACH ROW EXECUTE PROCEDURE on_sign_up();
Run Code Online (Sandbox Code Playgroud)

我的问题是通知有效负载。如果电子邮件包含逗号,那么我不能只在 ',' 上拆分字符串。我如何转义任何东西并将其放入有效载荷中?我可以添加我自己的自定义 CSV 转义函数并调用它,但是每当我认为这样的事情是正确的答案时,我通常会遗漏一些东西。

它不一定需要是 CSV,我只是认为这是最简单的。

注意:还有其他解决方案 - 例如去除“前缀”和“后缀”,然后将其余部分视为电子邮件。我对 PostgreSQL 本身内部的这种一般的清理/转义类更感兴趣。

我试图提取的表格如下:

                  Table "user_account"
     Column      |  Type   |         Modifiers          
-----------------+---------+----------------------------
 user_id         | integer | not null
 email           | citext  | not null
 password_hash   | text    | not null
 activated       | boolean | not null default false
 activation_code | uuid    | default uuid_generate_v4()
Run Code Online (Sandbox Code Playgroud)

Eva*_*oll 5

而不是担心如何摆脱它。只需使用 JSON 作为传输层。这里我们使用row_to_json

CREATE FUNCTION on_sign_up() RETURNS trigger as $$
  DECLARE
  BEGIN
    PERFORM pg_notify('sign_ups', row_to_json(NEW)::text );
    RETURN NEW;
  END;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

  • 只需投射`row_to_json(...)::text` (3认同)
  • 正是我来这里想说的。使用 json 负载。 (2认同)
  • @CraigRinger - 这对我有用,而且看起来更整洁。感谢您的提示 - 显然我对 Postgres 不太熟悉... (2认同)