2017-07-03 55 views
-4

从这个SQL查询,SQL注入法澄清

select Id, Name from Student1 
where Id = 1; 

表中的记录将只出现一个数据

1 Ramu S 

但是,这个查询执行时,

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

它显示桌子上的所有记录。那么,查询的功能如何?

+1

OR 1 = 1始终为真..所以选择所有行.. – scaisEdge

+0

条件1 = 1始终为真。因此,在查询结尾注释字符串“OR 1 = 1”会导致整个表被返回。 –

+0

好的谢谢你.. –

回答

0

你必须运行的查询为:

SELECT ID,姓名FROM Student1其中id = '' 或ID = '1';在您正在执行的查询中: SELECT Id,Name FROM Student1 WHERE Id =''OR 1 = 1;

你实际上是要求所有的ID,来自Student1的名称,其中条件(ID ='')为真或1 = 1为真。由于1总是等于1,因此您将得到表格中的所有值

0

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

+0

我永远不会保留'1 = 1',因为当你在OP的例子中使用OR时,这意味着无论他在'where id ='''将被忽略,查询将始终返回所有记录。 – GuidoG

+0

在使用OR的情况下也是如此。但是在AND的情况下,我经常使用这个构造,特别是如果在编译时不知道条件列表,而是在运行时构建的,您不必担心是否有一个或多个条件,可以生成如下查询:WHERE 1 = 1 AND条件... \ –

+0

是的,但是OP的问题是关于OR – GuidoG

0

如果你建立这样的查询:

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

那么任何人都可以输入1或1 = 1 textEdit1这将导致

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',那么该值将是无效的,因为编译器会检查f或者你发现这个值不适合那个领域。
这实际上更复杂我猜,但这是最简单的解释发生了什么事情。

关于该查询如何工作

因为您使用OR,意味着只有两个表达的一个必须是真实的。
因此要么是id = '' has to be true要么是1=1 has to be true

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

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