var result = from b in context.tests where b.id == inputTextBox.Text select b;
其中上下文是实体,测试是一个表.
我试图学习LINQ,我认为它的好处是它不容易受到sql注入的影响,但是我看到的一些东西的表现也有所不同.我需要参数化这个LINQ语句以使其更安全吗?如果是,怎么办?
也可以这样将linq作为linq到sql或linq的实体?
解决方法
长答案:
LINQ不像sql.幕后有一个完整的库,从编译器从代码生成的表达式树构建sql,将结果映射到对象 – 当然,它会在事情上保证安全.
Q. How is LINQ to sql protected from
sql-injection attacks?A. sql injection has been a significant risk for traditional sql
queries formed by concatenating user
input. LINQ to sql avoids such
injection by using sqlParameter in
queries. User input is turned into
parameter values. This approach
prevents malicIoUs commands from being
used from customer input.
在内部,这意味着当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
我建议您更深入地了解LINQ语句的实际意义,何时以及如何将其转化为真正的sql.您可能想了解LINQ standard query operator translation,deferred execution,different LINQ providers等.在LINQ的情况下,就像任何抽象技术一样,知道幕后发生的事情非常有用.
附:每次我看到有关sql注入的问题,我不禁要记住这个webcomic.