English 中文(简体)
• 如何清理SQKQ服务器中的机能(预先喷射)?
原标题:How to cleanse (prevent SQL injection) dynamic SQL in SQL Server?

我们拥有一个依赖SQ机能的SQ服务器程序。

储存程序参数在动态说明中使用。

我们需要在这些储存的程序中发挥标准验证功能,以验证这些参数,防止采用KQ。

认为我们有这些制约因素:

  1. 我们可以重新制定不使用动态结构的程序。

  2. 我们可以使用“OACreate”等眼光,使用常规表述进行验证。

  3. 我们可以修改要求所储存的程序的申请,以便在这些参数被送交储存程序之前予以确认。

我们是否可以筛选出一套特性,以确保我们不易遭到排斥?

最佳回答

我认为,有三个不同的案件需要担心:

  • strings (anything that requires quotes): + replace(@string, , ) +
  • names (anything where quotes aren t allowed): quotename(@string)
  • things that cannot be quoted: this requires whitelisting

<<>Note/strong>:Eachthing in a string/2007/5 (char/code>,varchar,nchar,nvarchar, 等来自用户控制来源的,必须使用上述一种方法。 这意味着,即便是你预期的数字,如果它们重新储存在扼制变量中,也会被引用。

详情见Microsoft Magazine(Obsoletelink:-10-19)<2016/sub>。

这里使用所有三种方法的例子:

EXEC  SELECT * FROM Employee WHERE Salary >     +
     REPLACE(@salary,     ,       ) +   -- replacing quotes even for numeric data
         ORDER BY   + QUOTENAME(@sort_col) +     +  -- quoting a name
     CASE @sort_dir WHEN  DESC  THEN  DESC  END     -- whitelisting

还注意到通过在<条码>EXEC说明中在线进行所有扼杀业务,对拖网问题没有任何关切。 如果你将中间结果分配给变量,那么你可以确保这些变量足以保持结果。 如果您有<代码>SET @result = QUOTENAME(@name),你应界定<代码>@result<>,以便至少持有258个特性(2* 128 + 2)。 如果您填写SET @result = REPLACE(@str, ),请将@result<>/code>的尺寸定为@str的两倍。 (可在@str中表述所有特性)作为引文。 当然,掌握最后方位表的直观变量必须足够大,足以控制所有静态变量加所有结果变量。

问题回答

The trivial cases can be established by QUOTENAME 注:

set @sql = N SELECT   + QUOTENAME(@column) + 
   N  FROM Table WHERE Name =   + REPLACE(@name,     ,       );

虽然QUOTENAME也可在字面上添加单一引文,代之以双重单一引文,因为它将输入到128种特性中,但并不建议。

但是,这只是冰山的一角。 有多种名称(dbo.table) 您需要适当注意:引用多部分名称后将形成一个无效识别码<>[dbo.table],必须加以细分和分立(使用< >>> PARSENAME/code><<<<>>>>><<<<>>>>>>>>>>>>>>>>>。

另一个问题是拖拉式攻击,即使你在字面上做三维REPLACE,也会发生这种攻击,见,《新喀克公司攻击与如何避免<>。

注射问题永远不可能通过每个程序的灵敏功能来解决。 我要求我履行一项职能,使我的法典能够更快地运作。 预防注射攻击是end-to-end 要求遵守纪律的游戏全程通过,不能简单地把它作为事后添加。 您的最佳机会是检查每一个单一程序,分析T-SQL代码line-by-line,然后发现这些问题。

这是一个真正的新问题,其not是你想要解决的问题,但这里是个三边案例,可以发挥作用(审查者,请让我知道,我是否错过了案件,这涉及<>NO<>/strong>保障”。

create proc Bad 
  @param nvarchar(500) 
as 

exec (N select     + @param + N    ) 

go

-- oops injected
exec Bad  help   select   0wned!   select     

go 

create proc NotAsBad
   @param nvarchar(500) 
as 

declare @safish nvarchar(1000), @sql nvarchar(2000) 
set @safish = replace(@param,     ,       )

set @sql = N select     + @safish  + N    

exec (@sql) 

go 

-- this kind of works, but I have not tested everything
exec NotAsBad  help   select   0wned!   select     

住房和财产管理局对这一战略有一些信息。 它应当永远是最后的选择(正如第一条关于与世系联系的内容所解释的),但如果它只选择了你们的选择......。

a 援引该条作为最后选择

However, this methodology is frail compared to using parameterized queries. This technique should only be used, with caution, to retrofit legacy code in a cost effective way. Applications built from scratch, or applications requiring low risk tolerance should be built or re-written using parameterized queries.

从本质上讲,反对这种做法的论点即使你确实逃脱了所有已知的坏意见,也没有任何保障,即有人会找到一种办法,在今后绕过这种做法。

然而,具体回答问题......

a 逃避犯罪的性质清单载于与上述条款有关的第一条。

<><>Edit>/strong> 如上所述,该条并没有提供很好的联系。 然而,对于服务器来说,这确实是:

Note that the list of characters you need to escape will vary based on the DB platform, but it looks like you re using SQL Server, so this should be relevant..

以下条款的案文:

收集投入也可能有助于通过消除逃逸性来防止卡片注入。 然而,由于可能产生问题的特性很多,这不是可靠的辩护理由。 The following example search for the nature string delimiter.

private string SafeSqlLiteral(string inputSQL)
{
  return inputSQL.Replace(" ", "  ");
}

LIKE Clauses

请注意,如果你使用LKE条款,则必须逃脱野心:

s = s.Replace("[", "[[]");
s = s.Replace("%", "[%]");
s = s.Replace("_", "[_]");

我们是否可以筛选出一套特性,以确保我们不易遭到排斥?

NO

绝食不称为“Certain Set Of Nature Injection”,也是出于某种原因。 排除某些特性可能会使特定用途复杂化,但does不能防止注入。 利用一种注射器,必须写到KQ。 并且不仅限于少数特殊性质。

你们能否获得CLR可能非常有用——你们至少可以使用KQL做许多、更有效的净化,而不是使用T-SQL。 在现实的世界上,你可以完全用参数说明和其他更强大的结构来取代所储存的胎盘。





相关问题
Export tables from SQL Server to be imported to Oracle 10g

I m trying to export some tables from SQL Server 2005 and then create those tables and populate them in Oracle. I have about 10 tables, varying from 4 columns up to 25. I m not using any constraints/...

SQL server: Can NT accounts be mapped to SQL server accounts

In our database we have an SQL server account that has the correct roles to access some of the databases. We are now switching to windows authentication and I was wondering if we can create a NT user ...

SQL Server 2000, ADO 2.8, VB6

How to determine if a Transaction is active i.e. before issuing Begin Transaction I want to ensure that no previous transaction are open.. the platform is VB6, MS-SQL Server 2000 and ADO 2.8