从这个SQL查询,SQL注入法澄清
select Id, Name from Student1
where Id = 1;
表中的记录将只出现一个数据
1 Ramu S
但是,这个查询执行时,
SELECT Id, Name FROM Student1 WHERE Id = '' OR 1=1
它显示桌子上的所有记录。那么,查询的功能如何?
从这个SQL查询,SQL注入法澄清
select Id, Name from Student1
where Id = 1;
表中的记录将只出现一个数据
1 Ramu S
但是,这个查询执行时,
SELECT Id, Name FROM Student1 WHERE Id = '' OR 1=1
它显示桌子上的所有记录。那么,查询的功能如何?
你必须运行的查询为:
SELECT ID,姓名FROM Student1其中id = '' 或ID = '1';在您正在执行的查询中: SELECT Id,Name FROM Student1 WHERE Id =''OR 1 = 1;
你实际上是要求所有的ID,来自Student1的名称,其中条件(ID ='')为真或1 = 1为真。由于1总是等于1,因此您将得到表格中的所有值
您可以保留'1 = 1'而没有任何问题,因为没有明智的查询优化器会在运行时评估它。它是一个常量(TRUE),当它独立或后跟'AND'时,它将被忽略[TRUE AND EXPR == Expr],或者当它跟随'OR'时,'OR'后面的表达式将会被忽略[TRUE OR EXPR == TRUE)。 我经常使用这个构造,当我构造一个WHERE子句,其中每个部分以'AND ...'开头。如果没有部分适用,则(1 = 1)仍然存在。
如果你建立这样的查询:
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
将仅返回等于''
的记录。在这种情况下,第二个条件会被忽略,因为它始终为真。
OR 1 = 1始终为真..所以选择所有行.. – scaisEdge
条件1 = 1始终为真。因此,在查询结尾注释字符串“OR 1 = 1”会导致整个表被返回。 –
好的谢谢你.. –