我们拥有一个依赖SQ机能的SQ服务器程序。
储存程序参数在动态说明中使用。
我们需要在这些储存的程序中发挥标准验证功能,以验证这些参数,防止采用KQ。
认为我们有这些制约因素:
我们可以重新制定不使用动态结构的程序。
我们可以使用“OACreate”等眼光,使用常规表述进行验证。
我们可以修改要求所储存的程序的申请,以便在这些参数被送交储存程序之前予以确认。
我们是否可以筛选出一套特性,以确保我们不易遭到排斥?
我们拥有一个依赖SQ机能的SQ服务器程序。
储存程序参数在动态说明中使用。
我们需要在这些储存的程序中发挥标准验证功能,以验证这些参数,防止采用KQ。
认为我们有这些制约因素:
我们可以重新制定不使用动态结构的程序。
我们可以使用“OACreate”等眼光,使用常规表述进行验证。
我们可以修改要求所储存的程序的申请,以便在这些参数被送交储存程序之前予以确认。
我们是否可以筛选出一套特性,以确保我们不易遭到排斥?
我认为,有三个不同的案件需要担心:
+ replace(@string, , ) +
quotename(@string)
<<>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,然后发现这些问题。
由于这些限制,你被rew弄。
这里有两个选择,可以给你一些方向:
使用只接受形式和关键词和表的提问的白色清单有效者/准备者。 这很可能只是与真正理解yn子的非常好的教区合作。
在有限环境中解答问题。 例如,使用权利非常有限的用户账户。 例如,只允许(现成)接触某些观点,这些观点永远不会归还敏感数据,而且无法接触所有其他观点、所有储存的程序、职能和表格。 更安全的是在另一个数据库服务器上进行这些查询。 也没有忘记可拆解OPENROWSET。
请指出:
如果接受所有问询,但关键词无效者除外,你肯定会失败,因为黑名单总是失败。 尤其使用诸如Q.等复杂语言。
Don tabe, 允许你无法信任的源头的动态是纯意义上的邪恶,即使你使用这些交换机,因为一度在bugs被发现,可以通过向服务器发送特别手工艺品加以滥用。 因此,即使你适用这些规则,风险仍然存在。
当你决定拿出一个能够充满活力的解决办法时。 不要认为你可以找到安全的解决办法,特别是如果你重新努力保护敏感的商业数据。 聘用一个数据库服务器安全专家帮助你这样做。
这是一个真正的新问题,其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("_", "[_]");
我们是否可以筛选出一套特性,以确保我们不易遭到排斥?
绝食不称为“Certain Set Of Nature Injection”,也是出于某种原因。 排除某些特性可能会使特定用途复杂化,但does不能防止注入。 利用一种注射器,必须写到KQ。 并且不仅限于少数特殊性质。
你们能否获得CLR可能非常有用——你们至少可以使用KQL做许多、更有效的净化,而不是使用T-SQL。 在现实的世界上,你可以完全用参数说明和其他更强大的结构来取代所储存的胎盘。
还有另一种办法,即
create procedure dbo.MYSP(@p1 varchar(100))
as begin
set @p1 = Replace(@p1, , ); -- Convert single quotes to spaces
set @p1 = Replace(@p1, ; , );
set @p1 = Replace(@p1, -- , );
set @p1 = Replace(@p1, /* , );
set @p1 = Replace(@p1, */ , );
set @p1 = Replace(@p1, xp_ , );
...
end;
您可以用空地或空洞地取代任何单一报价。 这种办法也可用来取代评论性质,例如*/---使用更多的替代指挥(如我刚才所示)。 但指出,只有你从不期望这些特性得到正常投入,这种做法才会奏效,这取决于你的申请。
Note the set of replaced characters is based on https://msdn.microsoft.com/en-us/library/ms161953(SQL.105).aspx
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/...
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 ...
I have been trying to execute a MS SQL Server stored procedure via JDBC today and have been unsuccessful thus far. The stored procedure has 1 input and 1 output parameter. With every combination I ...
Is it possible to use the sqlcmd command to dump table structure the way it can be done with mysqldump?
Hi I have the following SP, however when I use LINQ to SQL it generates 2 multiple recordsets. For my sanity I am trying to fathom out what it is in the stored procedure that is doing this and would ...
I want to create a table in MS SQL Server 2005 to record details of certain system operations. As you can see from the table design below, every column apart from Details is is non nullable. CREATE ...
I love the new DATE datatype in SQL Server 2008, but when I compare a DATE field to a DATETIME field on a linked server (SQL 2005, in this case), like this: DECLARE @MyDate DATE SET @MyDate = CONVERT(...
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