gpt4 book ai didi

c# - 在 linq c# 中防止 proc 中的 sql 注入(inject)

转载 作者:太空宇宙 更新时间:2023-11-03 19:46:58 26 4
gpt4 key购买 nike

我有一个包含 3 个文本框(stud_name、stud_city、stud_state)的搜索表单。当我在名称文本框中输入此 vaue ' drop table users 时,它将成功删除表。这是我调用存储过程的 c# 代码。如何在 C# 中使用 linq 防止这种类型的注入(inject)

using (iDataContext db = new iDataContext(connectionString))
{
var statusList = db.SP_Student_LOOKUP(name, city, state);
return statusList.ToList<SP_Student_LOOKUPResult>();
}

这是我的sp

CREATE proc SP_Student_LOOKUP @name varchar(50),          

@city varchar(50),

@state varchar(2)

as

declare @sql varchar(2048)

begin

set @sql = 'select * from student where ';

if (((@name is not null)) and (len(@name) > 0))

set @sql = @sql + ' studentname like ''%'+@name+'%'' and '

if (((@city is not null)) and (len(@city) > 0))

set @sql = @sql + ' studentcity like ''%'+@city+'%'' and '

if (((@state is not null)) and (len(@state) > 0))

set @sql = @sql + ' studentstate like ''%'+@state+'%'' and '

print @sql

exec( @sql )

最佳答案

您的存储过程容易受到 sql 注入(inject)的影响,因为您(不必要地)使用动态 sql 来构建查询。不要这样做。

你的存储过程应该是

CREATE proc SP_Student_LOOKUP 
@name varchar(50),
@city varchar(50),
@state varchar(2)
as

select * from student
where
(@name is null or len(@name) = 0 or studentname LIKE @name)
and (@city is null or len(@city) = 0 or studentcity like @city)
and (@state is null or len(@state) = 0 or studentstate like @state)

这与您的动态 sql 具有相同的行为,但有 1 个警告 - 要完全阻止 sql 注入(inject)漏洞,您需要将 %% 包裹在您的输入中 - by在存储过程中这样做你会重新引入同样的问题

关于c# - 在 linq c# 中防止 proc 中的 sql 注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44159725/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com