Postgresql

儲存過程可以防止 SQL 注入嗎?

  • June 21, 2021

儲存過程是否可以防止針對 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 注入。

引用自:https://dba.stackexchange.com/questions/127