【问题标题】:Sql Injection Method Clarification [duplicate]Sql注入方法说明[重复]
【发布时间】:2017-12-06 09:07:56
【问题描述】:

从此sql查询,

 select Id, Name from Student1 
 where Id = 1;

表格记录只会出现一条数据

 1  Ramu S

但是,这个查询在执行时,

 SELECT Id, Name FROM Student1 WHERE Id = '' OR 1=1

它显示了表的所有记录。那么,查询功能如何?

【问题讨论】:

标签: mysql sql-server


【解决方案1】:

如果您构建这样的查询:

string sql = 'select id, name from student1 where id = ' + textEdit1.Text

那么任何人都可以在 textEdit1 中键入 1 或 1=1,这将导致

select id, name from student1 where id = 1 or 1=1

如果你使用这样的参数:

string sql = 'select id, name from student1 where id = @id'
using (SqlCommand comm = new SqlCommand(sql)
{
    comm.Parameters.AddWithValue("@id", textEdit1.text)
    etc...
}

如果用户键入“1 或 1=1”,则该值将无效,因为编译器会为您进行检查并发现该值不适合该字段。
我猜它实际上更复杂,但这是对正在发生的事情的最简单的解释。

关于查询的工作原理

因为您使用 OR,这意味着两个表达式中只有一个必须为真。
所以要么id = '' has to be true要么1=1 has to be true

由于 1 始终为 1,此条件将始终返回 true,因此将返回表中的所有记录。
在这种情况下,第一个条件 id = '' 被忽略,因为第二个条件 1=1 为真。

如果您使用 AND 而不是 OR,情况会有所不同。
在这种情况下,两个条件都必须为真,id = '' AND 1=1 只会返回等于 ''
的记录 在这种情况下,第二个条件被忽略,因为它始终为真。

【讨论】:

    【解决方案2】:

    您可以毫无问题地保留“1 = 1”,因为没有任何明智的查询优化器会在运行时对其进行评估。它是一个常量 (TRUE),当它单独存在或后跟“AND”时,它将被忽略 [TRUE AND Expr == Expr] 或者当它后跟“OR”时,“OR”后面的表达式将被忽略被忽略 [TRUE OR Expr == TRUE)。 当我构造一个 WHERE 子句时,我经常使用这个构造,其中每个部分都以“AND ...”开头。如果没有部分适用,则 (1=1) 仍然存在。

    【讨论】:

    • 我永远不会保留那个 '1=1' 因为当你在 OP 的例子中使用 OR 时,这意味着他在 'where id = ''' 中所做的任何值都将被忽略,并且查询将始终返回所有记录。
    • 在使用 OR 的情况下是这样。但是在 AND 的情况下,我经常使用这个结构,特别是如果条件列表在编译时未知,而是在运行时构建,你不必担心你是否有一个或多个条件,你可以生成您的查询,例如:WHERE 1=1 AND conditions... \
    • 是的,但 OP 的问题是关于 OR 的具体问题
    • 并且在编译时不知道条件的情况下最好使用参数,例如'@@ID 不为空且 ID = @@ID'(我使用 2 @@,因为我不能在评论中只输入一个)
    • 同意使用参数化方法,这样更好。
    【解决方案3】:

    您必须将查询运行为:

    SELECT Id, Name FROM Student1 WHERE Id = ' ' OR Id='1';

    在你正在执行的查询中: SELECT Id, Name FROM Student1 WHERE Id = '' OR 1=1;

    您实际上是在询问所有 ID,来自 Student1 的名称,其中条件 (ID = ' ') 为真或 1=1 为真。由于 1 始终等于 1,因此您将获得表中的所有值

    【讨论】:

      猜你喜欢
      • 2012-09-04
      • 2018-09-29
      • 1970-01-01
      • 1970-01-01
      • 2020-04-28
      • 1970-01-01
      • 1970-01-01
      • 2018-04-23
      • 2014-12-22
      相关资源
      最近更新 更多