簡単な答えは、それ自体が SQL インジェクションを起こしやすいということではありません。したがって、これが SQL インジェクションにつながる可能性のあるシナリオを探しているmytable
ので、それがビューである可能性があり、その背後に追加の機能がある可能性があると考えてください。これらの関数は、SQL インジェクションに対して脆弱である可能性があります。
したがって、クエリを見て、SQL インジェクションの影響を受けにくいと結論付けることはできません。あなたができる最善のことは、提供されたレベルで、アプリケーションのこの特定のレベルがここで sql インジェクションの懸念を引き起こさないことを示すことです。
これは、SQL インジェクションが非常によく発生する可能性があるケースの例です。
CREATE OR REPLACE FUNCTION ban_user() returns trigger
language plpgsql security definer as
$$
begin
insert into banned_users (username) values (new.username);
execute 'alter user ' || new.username || ' WITH VALID UNTIL ''YESTERDAY''';
return new;
end;
あなたが示すようにユーティリティ関数をパラメータ化できないことに注意してquote_ident()
くださいnew.username
。
CREATE OR REPLACE VIEW banned_users_today AS
SELECT username FROM banned_users where banned_date = 'today';
CREATE TRIGGER i_banned_users_today INSTEAD OF INSERT ON banned_users_today
FOR EACH ROW EXECUTE PROCEDURE ban_user();
EXECUTE 'insert into banned_users_today (username) values ($1)'
USING 'postgres with password ''boo''; drop function ban_user() cascade; --';
いいえ、使用できるすべての場所で使用しても、問題が完全に解決されるわけではありません。また、適切に使用しても問題が解決するquote_literal()
とquote_ident()
は限りません。
問題は、実行しているクエリよりも常に低いレベルにある可能性があるということです。