不,存储过程不会阻止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注入.