这个LINQ语句是否容易受到SQL注入攻击?

Pet*_*ter 9 asp.net linq-to-entities linq-to-sql

这个LINQ语句是否容易受到SQL注入攻击?

var result = from b in context.tests
    where b.id == inputTextBox.Text
    select b;
Run Code Online (Sandbox Code Playgroud)

其中context是Entity,tests是一个表.我正在尝试学习LINQ,我认为它的好处是它不容易受到sql注入,但我看到的一些东西却有不同的说法.我是否需要参数化这个LINQ语句以使其更安全?如果是这样,怎么样?

这也被认为是linq to sql或linq to entities?

Dan*_*mov 32

简短回答:LINQ不容易受到SQL注入攻击.

答案很长:

LINQ不像SQL.幕后有一个完整的库,它从编译器从代码中生成的表达式树构建SQL,将结果映射到对象 - 当然,它会在路上安全地生成.

请参阅LINQ to SQL FAQ:

问:LINQ to SQL如何防止SQL注入攻击?

答:SQL注入一直是通过连接用户输入形成的传统SQL查询的重大风险.LINQ to SQL通过在查询中使用SqlParameter来避免这种注入.用户输入变为参数值.此方法可防止恶意命令被客户输入使用.

在内部,这意味着当LINQ to SQL查询数据库时,它不是使用普通值,而是将它们作为SQL参数传递,这意味着它们永远不会被数据库视为可执行代码.大多数(如果不是全部)ORM映射器也是如此.

比较这两种方法(完全伪代码):

string name = "' ; DROP DATABASE master  --"
run ("SELECT * FROM Authors WHERE Name = '" + name + "'") // oops!

// now we'd better use parameters
SqlParameter name = new SqlParameter ("@name", "' ; DROP DATABASE master  --")
run ("SELECT * FROM Authors WHERE Name = @name", name) // this is pretty safe
Run Code Online (Sandbox Code Playgroud)

我建议你深入了解LINQ语句实际意味着什么,以及何时以及如何将它们转换为真正的SQL.您可能想了解LINQ 标准查询运算符转换,延迟执行,不同的LINQ提供程序等.在LINQ的情况下,就像任何抽象技术一样,了解幕后发生的事情既令人着迷又非常有用.

PS每次我看到一个关于SQL注入的问题我都忍不住要记住这个webcomic.

sql注入