以下是我数据库中的公司名称。我正在尝试生成对SQL注入万无一失的快速字符串查询。
我测试了针对SQL Injection的参数化查询的安全容限级别,因为我听说它不是100%的传言。
===== userinput纯字符串但带有SQL注入的恶意内容=========
userinput = "Tubo'; UPDATE STOCK_TYPE SET Description='SQL Injection'" &
"WHERE STock_Type_ID=1; --'"
userinput = "'Some Name''; GRANT CONTROL TO [Malicious User]; PRINT ''Game over!" &
"This system is no longer yours!''" &
"-- Malicious User now can control the database!!!'"
userinput = "!!!@@@###$$$%%%^^^&&&***((()))///```~~~___---+++===:::;;;"""'''|||
\\\}}}>>><<<{{{}}}]]]...,,,[[[]]]///"
=====使用SQL Injected userinput搜索公司名称==========================
Dim SQL = "select p.Name from EntContext.COMPANIes as p Where p.Name like @CompanyName"
ObjectParamters.Add(New ObjectParameter("@CompanyName", userinput))
Dim databaseObjectQuery As ObjectQuery(Of DbDataRecord) =
New ObjectQuery(Of DbDataRecord)(SQL, EntContext)
databaseObjectQuery.Parameters.Add(parameter)
=============================================== =====================
COMPANIes.name数据库包含这些字符串以帮助我进行测试。 通过成功搜索用户输入,我认为我的代码对攻击更强。
但是当我使用确切的用户输入字符串搜索COMPANIes.name时,只有第一个userinput产生结果。
我将罪魁祸首缩小为'['它不会通过LINQPAD产生第二和第三个用户输入的结果
select p.company_id , p.Name
from EntContext.COMPANIes as p
Where p.Name like '%[%'
没有结果。这样做
select p.company_id , p.Name
from EntContext.COMPANIes as p
Where p.Name like '%/[%' escape '/'
通过匹配公司名称中的'['来生成针对第二和第三个用户输入的结果。
================尝试在VB.NET中以编程方式解决===============
FilterSQL = " AND COMPANies.Name like @CompanyName escape " + Chr(255)
objectParameters.Add(New ObjectParameter("CompanyName", "%" & Chr(255) &
searchResultParam.ParamValue.Value & "%"))
The simple identifier 'ÿ' must contain basic Latin characters only.
To use UNICODE characters, use an escaped identifier. Near line 1, column 320.
=============================================== ==============================
参数化查询是否100%万无一失甚至用户输入都是这样编码的?
ObjectParamters.Add(New ObjectParameter(“@ CompanyName”,userinput))
我的假设超过了第二个和第三个用户输入正确的转义此字符'['?
在LINQ的参数化查询中,如何搜索这个确切的存储值?
COMPANIes.Name =“!@#$%^&amp; *()/`~_- + = :;”'|}&gt;&lt; {}]。,[] /“
< / LI> 醇>答案 0 :(得分:0)
此代码的突破
FilterSQL = " AND COMPANies.Name like @CompanyName escape '['"
Dim escCrit As String = "%" & ParamValue.Value.Replace("[", "[[") & "%"
objectParameters.Add(New ObjectParameter("CompanyName", escCrit ))
这是实际和字面ID&amp;存储在我的COMPANies.Name列中的名称。
吐蕃'; UPDATE STOCK_TYPE SET描述='SQL注入'WHERE STOCK_Type_ID = 1; - “
'某些名字'';对[恶意用户]的授予控制权; PRINT''游戏结束!这个系统不再是你的!'' - 恶意用户现在可以控制数据库!!!'
!!! @@@ ### $$$ %%% ^^^&安培;&安培;&安培; * ((()))///``` ~~~ _ --- +++ === ::: ;;; “”“ '''||| \}}}&GT;&GT;&GT;&LT;&LT;&LT ; {{{}}}]]] ... ,,, [[[]]] /// ??? '''
@#$%^&安培; *()/`〜_- + = :;“'|}&GT;。&LT; {}],[] /ȸ
userinput = Tubo'; UPDATE STOCK_TYPE SET Description='SQL Injection' WHERE STock_Type_ID=1; --'
找到公司ID 1
userinput = 'Some Name''; GRANT CONTROL TO [Malicious User]; PRINT ''Game over! This system is no longer yours!'' -- Malicious User now can control the database!!!'
找到公司ID 2
userinput = !!!@@@###$$$%%%^^^&&&***((()))///```~~~___---+++===:::;;;"""'''|||
\\\}}}>>><<<{{{}}}]]]...,,,[[[]]]///
找到公司ID 3
userinput = ?!@#$%^&*()/`~_-+=:;"'|}><{}].,[]/ȸ
找到公司ID
userinput = [
公司ID 2,3和5发现
userinput = []
找到公司ID 3和5
userinput = [[[
找到公司ID 3
这回答了我的第三个问题。我没有必要过滤任何输入,也没有必要限制文本框搜索条件。此模式甚至可以容纳特殊字符,尤其适用于在数据库中存储用户的公共注释。他们可以在文本块中输入任何内容。我不知道为什么'['需要特定代码作为逃避。我认为这是一个错误,实体框架团队忘了逃避'['。然而,它们确实逃脱了我迄今测试过的所有其他内容。注意字符ȸ拉丁文小写字母Db有向图是有意的。
我想知道发生了什么魔法。我认为SQL是与参数分开发送的。当SQL永远不会满足参数时,我们永远无法获得SQL注入。不可能,因为SQL注入的形式依赖于脏SQL。但SQL从未遇到过注入。我对特殊字符范围的测试用例表明了这一点。
我认为实现隐式在LINQ的后端使用sp_executesql。在后端,SQL执行执行计划,而参数则匹配为字符串文字。我必须要小心,我的SQL永远不会“满足”来自前端或数据库后端的用户输入。