存储过程是否可以防止针对Postgresql数据库的sql注入攻击?我做了一些研究,发现即使我们只使用存储过程,sql Server,Oracle和
MySQL也不能安全地防止sql注入.但是,Postgresql中不存在此问题.
Postgresql核心中的存储过程实现是否会阻止sql注入攻击,还是其他什么?或者即使我们只使用存储过程,Postgresql也容易受到sql注入?如果是这样,请给我一个例子(例如书籍,网站,纸张等).
不,存储过程不会阻止sql注入.这是一个不幸允许sql注入的存储过程的实际示例(来自我工作的内部应用程序).
CREATE PROCEDURE [dbo].[sp_colunmName2] @columnName as nvarchar(30),@type as nvarchar(30),@searchText as nvarchar(30) AS BEGIN DECLARE @sqlStatement NVARCHAR(4000) BEGIN SELECT @sqlStatement = 'select * from Stations where ' + @columnName + ' ' + @type + ' ' + '''' + @searchText + '''' EXEC(@sqlStatement) END END GO
大致相当于postgres:
CREATE or replace FUNCTION public.sp_colunmName2 ( columnName varchar(30),type varchar(30),searchText varchar(30) ) RETURNS SETOF stations LANGUAGE plpgsql AS $$ DECLARE sqlStatement VARCHAR(4000); BEGIN sqlStatement = 'select * from Stations where ' || columnName || ' ' || type || ' ' || ''''|| searchText || ''''; RETURN QUERY EXECUTE sqlStatement; END $$;
开发人员的想法是创建一个通用的搜索过程,但结果是WHERE子句可以包含用户想要的任何内容,允许从little Bobby Tables访问.
无论您使用sql语句还是存储过程都无关紧要.重要的是您的sql是使用参数还是连接字符串.参数阻止sql注入;连接字符串允许sql注入.