Postgresql
儲存過程可以防止 SQL 注入嗎?
儲存過程是否可以防止針對 PostgreSQL 數據庫的 SQL 注入攻擊?我做了一些研究,發現即使我們只使用儲存過程,SQL Server、Oracle 和 MySQL 也不能安全地防止 SQL 注入。但是,這個問題在 PostgreSQL 中不存在。
PostgreSQL 核心中的儲存過程實現是防止 SQL 注入攻擊還是別的什麼?或者即使我們只使用儲存過程,PostgreSQL 也容易受到 SQL 注入的影響?如果是這樣,請給我一個例子(例如書籍、網站、論文等)。
不,儲存過程不會阻止 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 子句可以包含使用者想要的任何內容,從而允許從小Bobby Tables進行訪問。
無論您使用 SQL 語句還是儲存過程都無關緊要。重要的是您的 SQL 是使用參數還是連接字元串。參數防止SQL注入;串聯的字元串允許 SQL 注入。