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.

| 归档时间: |
|
| 查看次数: |
8070 次 |
| 最近记录: |