Giải pháp của bạn khắc phục việc chuyển NEW
được nhập theo hàng Biến đổi. Tuy nhiên, bạn có một lỗ hổng chèn SQL lén lút trong mã của mình, điều đó đặc biệt nguy hiểm trong SECURITY DEFINER
hàm số. Đầu vào của người dùng phải không bao giờ được chuyển đổi thành mã SQL không thoát.
Vệ sinh như thế này:
CREATE OR REPLACE FUNCTION trg_test_log()
RETURNS trigger AS
$$
BEGIN
EXECUTE 'INSERT INTO public.' || quote_ident('testlog_' || NEW.name)
|| ' SELECT ($1).*'
USING NEW;
RETURN NULL;
END
$$
LANGUAGE plpgsql SECURITY DEFINER;
Ngoài ra:
-
OLD
không được định nghĩa trongINSERT
kích hoạt. - Bạn không cần một biến. Bài tập tương đối đắt trong plpgsql.