我的代码中有这个sql漏洞吗?因为我已经参数化了SQL,所以没有sql注入?任何人都会给予一些建议会欣赏!如果是的话,如何修复?
ASP.NET代码:
public DataTable CompanySearchUser(int pageSize, int currentPage, string whereCondition)
{
DbParameter[] parms = {
DbHelper.MakeInParam("@PageSize",(DbType)SqlDbType.Int,4,pageSize),
DbHelper.MakeInParam("@PageNumber",(DbType)SqlDbType.Int,4,currentPage),
DbHelper.MakeInParam("@where",(DbType)SqlDbType.NVarChar,500,whereCondition)
};
DataTable userlist = DbHelper.ExecuteDataset(CommandType.StoredProcedure, "spCompanySearchUser", parms).Tables[0];
return userlist;
}
SQL CODE:
ALTER PROC [dbo].[spCompanySearchUser]
@PageSize INT
@PageNumber INT,
@where nvarchar(550)--like 'and a=1 '
AS
DECLARE @RowStart INT
DECLARE @RowEnd INT
DECLARE @SQL NVARCHAR(4000)
IF @PageNumber > 0
BEGIN
SET @PageNumber = @PageNumber - 1
SET @RowStart = @PageSize * @PageNumber + 1;
SET @RowEnd = @RowStart + @PageSize - 1;
SET @SQL='
WITH AllUsers
AS (SELECT
UB.UserBaicInfoID,
UB.UserName,
UB.HighestEducation,
UB.Age,
UB.Sex,
UB.WorkExperience,
UB.PositionDesired,
UB.UpdateTime,
Row_number() OVER (ORDER BY UB.UpdateTime DESC) AS RowNumber
From UserBasicInfo UB
WHERE ResumeState=1 '+@where+')
SELECT * FROM AllUsers WHERE RowNumber >=' + Str(@RowStart) + ' AND RowNumber <= ' + Str(@RowEnd) + ''
EXEC sp_executesql @SQL
END
我的代码中有这个sql漏洞吗?因为我已经参数化了SQL,所以没有sql注入?任何人都会给予一些建议会欣赏!如果是的话,如何修复?
答案 0 :(得分:0)
目前无法测试,但我会说是的。
你传入@where并进行连接,你的@where正在执行实际的sql代码而不是真正的“where”子句
然后你对最终的sql代码执行exec
这可以被利用
不确定你的whereCondition是什么样的,但试试这个
public DataTable CompanySearchUser(int pageSize, int currentPage, string whereCondition)
{
/**** add this to test ****/
whereCondition += " or 1=1";
/**** add this to test ****/
DbParameter[] parms = {
DbHelper.MakeInParam("@PageSize",(DbType)SqlDbType.Int,4,pageSize),
DbHelper.MakeInParam("@PageNumber",(DbType)SqlDbType.Int,4,currentPage),
DbHelper.MakeInParam("@where",(DbType)SqlDbType.NVarChar,500,whereCondition)
};
DataTable userlist = DbHelper.ExecuteDataset(CommandType.StoredProcedure, "spCompanySearchUser", parms).Tables[0];
return userlist;
}
答案 1 :(得分:0)
它仍然不安全且不具备性能。
您应该动态地执行SQL并在那里添加参数,而不是依赖于sp_executeSQL。
使用@
占位符项cmd.Parameters.AddWithValue("@placeholder", value)
值构建字符串,然后添加这些参数,通常会更好,更安全,更易于管理,并且不会浪费SQL的时间,因为它不会能够优化你的陈述。
实际上,在代码中动态地执行它可以获得更好的性能,而不是在存储过程中,因为SQL将缓存每个语句并在相同的语句出现时重新执行它们。