2017-07-03 42 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將僅返回等於''
的記錄。在這種情況下,第二個條件會被忽略,因爲它始終爲真。