Asp.net 此LINQ语句易受SQL注入攻击吗?

Asp.net 此LINQ语句易受SQL注入攻击吗?,asp.net,linq-to-sql,linq-to-entities,Asp.net,Linq To Sql,Linq To Entities,此LINQ语句易受SQL注入攻击吗 var result = from b in context.tests where b.id == inputTextBox.Text select b; 其中,上下文是一个实体,测试是一个表。 我正在尝试学习LINQ,我认为它的好处是它不易受到sql注入的攻击,但我看到的一些东西有不同的说法。我需要参数化这个LINQ语句以使它更安全吗?如果是,怎么做 这也会被认为是linq to sql还是linq to entities?否。linq

此LINQ语句易受SQL注入攻击吗

var result = from b in context.tests
    where b.id == inputTextBox.Text
    select b;
其中,上下文是一个实体,测试是一个表。 我正在尝试学习LINQ,我认为它的好处是它不易受到sql注入的攻击,但我看到的一些东西有不同的说法。我需要参数化这个LINQ语句以使它更安全吗?如果是,怎么做


这也会被认为是linq to sql还是linq to entities?

否。linq to entities和linq to sql处理sql查询的生成,以避免sql注入。如果您想了解在使用各种输入运行此查询时生成的SQL语句,可以使用LINQPad

是LINQ to SQL还是LINQ to Entities取决于
上下文
对象是什么,不能从这个代码片段中确定


在LINQ中,唯一需要担心SQL注入的时候是使用ExecuteQuery方法运行自定义SQL查询()。但此时,您已经离开了语言集成查询,回到了生成自己字符串的世界。

LINQ使用参数化查询,因此通常不易受SQL注入的影响。例如,您的示例不易受攻击。

LINQ to Entities提供程序使用参数化查询,并且对SQL注入完全安全。

LINQ to SQL生成参数化查询,因此它可以防止SQL注入攻击。

简短回答:LINQ不易受SQL注入攻击。

长答案:

LINQ不像SQL。在后台有一个完整的库,它从编译器根据代码生成的表达式树中构建SQL,将结果映射到对象,当然它还负责确保过程中的安全

见:

如何保护LINQ到SQL免受攻击 SQL注入攻击

A.SQL注入一直是传统SQL的一个重大风险 通过连接用户 输入。LINQtoSQL避免了这种情况 在中使用SqlParameter进行注入 查询。用户输入被转换为 参数值。这种方法 防止恶意命令被删除 从客户输入中使用

在内部,这意味着当LINQ to SQL查询数据库时,它将不使用普通值,而是将它们作为SQL参数传递,这意味着数据库永远不能将它们视为可执行代码。对于大多数(如果不是全部的话)ORM映射程序来说也是如此

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

我建议您深入研究LINQ语句的实际含义,以及它们何时以及如何转换为真正的SQL。你可能想了解LINQ等等。就LINQ而言,与任何抽象技术一样,了解幕后发生的事情既有趣又非常有用

另外,每次我看到一个关于SQL注入的问题,我都会忍不住想起这个网络喜剧


Linq将所有查询参数化,因此不易受到SQL注入攻击。但是,您仍然应该验证所有用户输入,否则您将面临跨站点脚本攻击。

但是,如果您使用Linq连接字符串和输入,您可能仍然容易受到攻击。谢谢。顺便说一句,xkcd是惊人的。我认为LINQ是在参数化查询,但我不能100%确定我是否正确/安全地使用了LINQ。虽然我同意应该验证用户输入,但我看不出跨站点脚本攻击与此有什么关系。这取决于实际对数据做了什么,如果您直接从数据库中显示数据,任何自定义脚本都将/可能被执行。哦,那么您指的是在浏览器中显示用户输入的文本时不转义HTML,对吗?这不是我要归类为验证用户输入的内容,但我明白你的意思。
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