存储过程是否可以防止针对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注入.