Postgresql
如何安全地填充 pg_notify 有效載荷?
數據通過準備好的語句和儲存過程進入我的應用程序,所以我不太擔心注入。當新使用者註冊時,我想發送一封啟動電子郵件。目前我正在使用觸發器和通知來執行此操作。它看起來像這樣:
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;