gpt4 book ai didi

sql - 我对 SQL 注入(inject)安全吗

转载 作者:行者123 更新时间:2023-11-29 11:37:42 24 4
gpt4 key购买 nike

我想知道当我在 PostgresSQL 中使用类似的东西时,我是否可以安全地防止 SQL 注入(inject):

CREATE or REPLACE FUNCTION sp_list_name( VARCHAR )
RETURNS SETOF v_player AS '
DECLARE
v_start_name ALIAS FOR $1;
r_player v_player%ROWTYPE;
v_temp VARCHAR;
BEGIN
v_temp := v_start_name || ''%'';
FOR r_player IN
SELECT first_name, last_name FROM v_player WHERE last_name like v_temp
LOOP
RETURN NEXT r_player;
END LOOP;
RETURN;
END;
' LANGUAGE 'plpgsql' VOLATILE;

我想用这个函数来列出以字母开头的玩家名字。

select * from sp_list_name( 'A' );

给我姓氏以 A 开头的球员。

我试着注入(inject)sql

select * from sp_list_name( 'A; delete from t_player;--' );
select * from sp_list_name( '''; delete from t_player;--' );

我安全吗?

我可以注入(inject)哪种情况?

问候

最佳答案

就您的程序而言,您看起来很安全,因为 SP 中的变量不会扩展为代码,但如果您不使用像“SELECT * 这样的参数化查询,您仍然可以暴露自己FROM sp_list_name(?);"在您的应用程序代码中。诸如“SELECT * FROM sp_list_name('$start_name');”之类的内容可能会被用户传递的起始名称“'”所破坏;从 t_player 中删除 last_name NOT IN (')。因此请使用参数化查询或完整性检查程序中的输入。

注意:其他人请注意,存储过程中的变量不会扩展为代码,即使它包含 ' 或 ;,(不包括传递给EXECUTE,您将使用 quote_literal,而不是手动 replace 函数) 所以替换 ; or ' 是完全不必要的(在存储过程中,使用它的应用程序当然是另一回事)并且会阻止您总是找到“tl;dr”或“O' Grady”团队。

Leo Moore、Karl、LFSR Consulting:存储过程中的 v_temp_name 不会扩展为 SP 中的代码(没有 EXECUTE),检查需要在应用程序中完成,而不是 SP(或者 OP 可以只在他们的应用程序代码中使用参数化查询)。其他人的建议类似于担心

my $bar = "foo; unlink('/etc/password');"; 
my $baz = $bar;

在没有评估的情况下实际运行取消链接。

关于sql - 我对 SQL 注入(inject)安全吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/627918/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com