Postgresql

如何安全地填充 pg_notify 有效載荷?

  • July 15, 2017

數據通過準備好的語句和儲存過程進入我的應用程序,所以我不太擔心注入。當新使用者註冊時,我想發送一封啟動電子郵件。目前我正在使用觸發器和通知來執行此操作。它看起來像這樣:

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();

我的問題是通知有效負載。如果電子郵件包含逗號,那麼我不能只將字元串拆分為“,”。我如何逃避任何東西並將其放入有效載荷中?我可以添加我自己的自定義 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()

而不是擔心如何逃脫它。只需使用 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;

引用自:https://dba.stackexchange.com/questions/179820