加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

sql-server – 为什么在存储过程中的此查询中不会发生SQL注入?

发布时间:2020-12-31 11:44:13 所属栏目:编程 来源:网络整理
导读:我做了以下存储进程: ALTER PROCEDURE usp_actorBirthdays (@nameString nvarchar(100),@actorgender nvarchar(100))ASSELECT ActorDOB,ActorName FROM tblActorWHERE ActorName LIKE '%' + @nameString + '%'AND ActorGender = @actorgender 此刻,我实行做

我做了以下存储进程:

ALTER PROCEDURE usp_actorBirthdays (@nameString nvarchar(100),@actorgender nvarchar(100))
AS
SELECT ActorDOB,ActorName FROM tblActor
WHERE ActorName LIKE '%' + @nameString + '%'
AND ActorGender = @actorgender

此刻,我实行做这样的工作.大概我做错了,但我想确保这样的进程可以阻止任何SQL注入:

EXEC usp_actorBirthdays 'Tom','Male; DROP TABLE tblActor'

下图表现了在SSMS中执行的上述SQL,而且功效正确表现而不是错误:

趁便说一句,我在查询完成执行后添加了分号后头的部门.然后我再次执行它,可是当我搜查表tblActor是否存在时,它如故存在.莫非我做错了什么?可能这真的是防打针吗?我想我在这里要问的是,这是一个像这样安详的存储进程吗?感谢.

办理要领

此代码正常事变,由于它是:

>参数化,和
>没有做任何动态SQL

为了使SQL注入事变,您必需构建一个查询字符串(您没有这样做),而不是将单个撇号(‘)转换为转义撇号(”)(通过输入参数转义).

在你试图转达“妥协”代价时,’男性; DROP TABLE tblActor’字符串只是一个平凡的字符串.

此刻,假如你正在做的工作:

DECLARE @SQL NVARCHAR(MAX);

SET @SQL = N'SELECT fields FROM table WHERE field23 = '
          + @InputParam;

EXEC(@SQL);

然后,这将轻易受到SQL注入,由于该查询不在当前的预理会上下文中;该查询今朝只是另一个字符串.以是@InputParam的代价也许是’2015-10-31′; SELECT * FROM PlainTextCreditCardInfo;这也许会发生题目,由于该查询将被泛起并执行,如下所示:

SELECT fields FROM table WHERE field23 = '2015-10-31'; SELECT * FROM PlainTextCreditCardInfo;

这是行使存储进程的一个(几个)首要缘故起因:本质上更安详(好吧,只要你不通过构建像我上面所示的查询而不验证所行使的任何参数的值来规避安详性).固然假如必要构建动态SQL,首选要领是行使sp_executesql对其举办参数化:

DECLARE @SQL NVARCHAR(MAX);

SET @SQL = N'SELECT fields FROM table WHERE field23 = @SomeDate_tmp';

EXEC sp_executesql
  @SQL,N'SomeDate_tmp DATETIME',@SomeDate_tmp = @InputParam;

行使这种要领,有人试图转达’2015-10-31′; SELECT * FROM PlainTextCreditCardInfo;对付DATETIME输入参数,在执行存储进程时会堕落.可能纵然存储进程接管@InputParameter作为NVARCHAR(100),它也必需转换为DATETIME才气传入sp_executesql挪用.纵然动态SQL中的参数是字符串范例,起首进入存储进程,任何单个撇号城市自动转义为双撇号.

有一种鲜为人知的进攻范例,进攻者试图用撇号添补输入字段,以便存储进程内部用于结构动态SQL但声明太小的字符串不能得当全部内容并推出竣事的撇号,并以某种方法最终获得正确数目的撇号,以便不再在字符串中“转义”.这被称为SQL截断,并在MSDN杂志文章“新SQL截断进攻和怎样停止它们”中举办了接头,但该文章已不再在线.它 – 2006年11月版的MSDN杂志 – 仅在存档文件中提供(.chm名目):
http://download.microsoft.com/download/3/a/7/3a7fa450-1f33-41f7-9e6d-3aa95b5a6aea/MSDNMagazineNovember2006en-us.chm我可以或许下载它并拉出目次,这表现了文章,但我好像无法查察它.

有关SQL注入(包罗各类RDBMS和方案)的更多具体信息,请参阅Open Web Application Security Project(OWASP)中的以下内容:
Testing for SQL Injection

SQL注入和SQL截断的相干仓库溢出谜底:
How safe is T-SQL after you replace the ‘ escape character?

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读