Sql-Server

TSQL - Sql 注入

  • September 9, 2020
DECLARE @TSQL NVARCHAR(MAX) = N'SELECT 1, ''One''';

CREATE TABLE #ThisIsATable (Id INT, VAL NVARCHAR(10));

INSERT INTO #ThisIsATable
EXEC [dbo].[sp_executesql] @TSQL ;

將@TSQL 之類的輸入參數輸入到儲存過程並以這種方式使用它是否安全?

這不是一種安全的方法。

您可以執行此快速展示以查看可能出現的問題

create database demo
Go

use demo
Go

Create table SomeVeryImportantData (id int, txt varchar(30));
insert into SomeVeryImportantData values (1,'some txt');

DECLARE @TSQL NVARCHAR(MAX) = N'truncate table SomeVeryImportantData;'

CREATE TABLE #ThisIsATable (Id INT, VAL NVARCHAR(10));

INSERT INTO #ThisIsATable
EXEC [dbo].[sp_executesql] @TSQL ;

select * from SomeVeryImportantData;

drop table #ThisIsATable

你可能想做這樣的事情:

declare @param1 int;
declare @param2 varchar(30);

set @param1=1;
set @param2='one';

DECLARE @TSQL NVARCHAR(MAX) = N'SELECT @param1, @param2';

CREATE TABLE #ThisIsATable (Id INT, VAL NVARCHAR(10));

INSERT INTO #ThisIsATable
EXEC [dbo].[sp_executesql] @TSQL, N'@param1 int, @param2 varchar(30)', @param1=@param1, @param2=@param2

select * from #ThisIsATable;

drop table #ThisIsATable

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