我有基于c#表单的Web应用程序。当我通过Acunetix网络扫描仪扫描应用程序时,它在添加模块部分给我一个盲目的SQL注入。 Acunteix生成的报告是
POST (multipart) input ctl00$ContentPlaceHolder1$ddlRecommendoffer was set to -87
POST /
这个ddlRecommendoffer是一个下拉列表,从数据库中获取值,当我将表单存储在数据库中时,我得到了这个下拉列表的值
ddlRecommendoffer.SelectedValue.ToString()
DDL值理想情况下应为int(数据库中Row的Id)
我正在使用带参数的存储过程将其插入到数据库中,该数据库应该停止Sql注入但是为什么它会在这个字段上显示BLIND SQL INJECTION ...
答案 0 :(得分:1)
当注入尝试没有直接反馈时,例如,当SQL语句的结果没有返回给用户时,SQL注入被称为盲注。
如果您使用存储过程,如果它使用参数动态构建查询,您的应用程序可能仍然容易受到攻击:
Create Procedure sp_EmployeeSelect
@EmployeeName NVarchar(100)
AS
Declare @SQLQuery AS NVarchar(4000)
SET @SQLQuery = 'SELECT * FROM tblEmployees
WHERE EmployeeName LIKE ''%' + @EmployeeName + '%'''
EXECUTE sp_executesql @SQLQuery
GO
在这里你仍然可以通过 EmployeeName 注入SQL,因为它没有正确格式化/转义。
但是,使用参数化表单是安全的:
Create Procedure sp_EmployeeSelect
@EmployeeName NVarchar(100)
AS
Declare @SQLQuery AS NVarchar(4000)
Declare @ParamDefinition AS NVarchar(2000)
SET @SQLQuery = 'SELECT * FROM tblEmployees
WHERE EmployeeName LIKE ''%'' + @EmployeeName + ''%'''
SET @ParamDefinition = '@EmployeeName NVarchar(100)'
EXECUTE sp_executesql @SQLQuery, @ParamDefinition,
@EmployeeName
GO