【问题标题】:Is injection attack possible on the following code?以下代码可以进行注入攻击吗?
【发布时间】:2014-02-27 11:36:29
【问题描述】:

我必须为我的项目的每种网络应用程序攻击类型创建两个应用程序。 一种攻击有效,另一种无效。 在编写sql注入代码时,我得到了以下代码:

易受攻击的

EmpTable result = ctx.Database.SqlQuery<EmpTable>("Select * from EmpTable where username = '" + TxtUsername.Text + "'and password = '" + TxtPassword.Text + "'").FirstOrDefault();

而且,刀枪不入:

EmpTable result = (from reff in ctx.EmpTables.Where(p => (p.Username == TxtUsername.Text) && (p.Password == TxtPassword.Text)) select reff).FirstOrDefault();

我只是想确保没有办法对无懈可击的人进行注入攻击。 请告诉我代码是否真的无懈可击。

【问题讨论】:

  • 我相信 LINQ 会将查询转换为参数化的 SQL,因此您应该避免 SQL 注入。
  • 第二版的LinqToSQL引擎为你生成参数,应该没问题
  • 除了sql注入之外,以纯文本格式存储密码然后执行简单的字符串比较从来都不是一个好主意。如果数据库遭到破坏,您的客户的所有密码都将被泄露。相反,存储 SHA-256 或更好的密码哈希,然后比较来自数据库和用户界面的哈希结果。
  • 使用 LINQ 有什么缺点吗?为什么人们在大多数应用程序中都使用 sql?
  • 我认为主要是基于程序员的习惯和现有知识。

标签: c# asp.net security sql-injection


【解决方案1】:

是的,在第二种情况下,我相信这是无懈可击的,因为您将责任传递给 LINQ(以及实体框架、NHibernate 或其他类似的 ORM 工具)来执行数据库查询。它应该能够安全地处理你的 SQL,因为它提供了这个任务。

在第一种情况下,您应该使用Parameter 来避免 SQL 注入,例如:

ctx.Database.ExecuteSqlCommand(@"select * from EmpTable where username = @user and password = @pass", 
                                new SqlParameter("user", TxtUsername.Text), 
                                new SqlParameter("pass", TxtPassword.Text));

Obs:我没试过

【讨论】:

  • 请您告诉如何在第一个代码上实现参数
猜你喜欢
  • 1970-01-01
  • 2015-04-23
  • 1970-01-01
  • 2010-12-25
  • 1970-01-01
  • 2012-04-14
  • 2018-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多