快速回答是,它本身并不容易受到 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()
并不总能解决问题。
问题是问题总是比您正在执行的查询低。