從這個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」會導致整個表被返回。 –
好的謝謝你.. –