2010-01-26 82 views
3

所以,我讀到有關SQL注入的文章,並有一個例子:SQL注入和兩個查詢

SELECT * FROM table_name WHERE smth = 'x'; 
UPDATE table_name SET smth ='[email protected]' WHERE user = 'admin'; 

爲什麼它不工作?或者這是一篇舊文章,現在這種方式是無稽之談?那麼黑客如何更新mysql呢? 謝謝。

+0

你的問題不是很清楚。你想獲得幫助,以在網頁上使用SQL注入? – Younes 2010-01-26 15:11:04

+4

你在問什麼? – SLaks 2010-01-26 15:12:08

+1

不知道原始查詢是看什麼注射將工作。看看我的答案在這裏http://stackoverflow.com/questions/332365/xkcd-sql-injection-please-explain/332367#332367有些人認爲它是如何工作的一個很好的解釋。至於你的特定文章,不能回答爲什麼它不起作用。 – Will 2010-01-26 15:15:16

回答

2

現在大多數網站都使用參數化的SQL,而不是內聯SQL。這種情況會發生,如果上面例如,有分析,內聯SQL,類似以下內容:

非參數僞

string sql = "SELECT * FROM table_name WHERE smth='" + UserInput + "'"; 
ExecuteSql(sql); 

...其中UserInput定義了網站上的元素。

而不是增加有效數據的UserInput領域,您可以添加,

UserInput = '';DROP table_name; 

...你實際上將增加新的邏輯來查詢的結束,導致惡意使用該系統。

參數化語句消除了SQL注入的可能性,因爲您無法通過向簽名中插入邏輯來修改查詢的結構。

如果您試圖將UserInput字段設置爲惡意查詢,但該網站在語句中使用了參數,那麼您將不幸運。

參數僞:

Adapter proc; 
proc.StoredProcedure = "GetUserNames" 
proc.AddParameter("@USER",UserInput); 
proc.Execute(); 

...作爲@USER現在等於文字 「」\; DROP表名;「,其中,SQL會將作爲一個普通OL」參數。

+0

我的問題其實是: SELECT * FROM table_name WHERE smth ='x'; UPDATE table_name SET smth ='[email protected]'WHERE user ='admin'; 爲什麼這個查詢不起作用? – 2010-01-26 15:22:55

0

這取決於你如何執行上面的代碼。

許多代碼語言都有專用的數據庫通信類,您可以使用sql參數而不是串聯字符串。

SQL注入的風險是忘記在查詢中轉義某些用戶輸入,從而允許執行格式錯誤的查詢。

0

SQL注入攻擊背後的想法是這樣的:

我有一個網站,讓用戶搜索有關動物的信息。在動物的名稱,用戶類型,然後運行:

select * from animals where name = '$[what the user typed in]'; 

因此,如果他們在羊型,查詢變爲:

select * from animals where name = 'sheep'; 

但是,如果他們輸入:'羊」 ;放桌動物'?如果我只是將他們鍵入的內容複製到查詢中並運行它,我將運行:

select * from animals where name = 'sheep'; drop table animals; 

這會很糟糕。

如果設置網站和數據庫的人不仔細查找和清理用戶輸入的任何SQL,這種攻擊仍然可能發生。

0

DB 101對SQL注入進行了熱烈的警告,所以現在大多數開發人員都知道並阻止了它。這通常是通過使用某種預先準備好的語句完成的,其中通過防止任意SQL執行的機制注入參數。懶惰的編程仍然會導致漏洞,並且他們確實存在,但是,盲目的動態SQL構建更爲罕見且罕見。

0

當您有查詢「模板」並且需要用戶輸入來填寫某些查詢時,SQL注入攻擊纔有可能。例如,你可能有一個PHP腳本,它是這樣的:

<?php 
$smth_value = $_POST["smth"]; // some form field 
$smth_user = $_POST["user"]; // some other form field 
$smth_email = $_POST["email"]; // yet another form field 

$sql1 = "SELECT * FROM table_name WHERE smth = '".$smth_value."'"; 
$sql2 = "UPDATE table_name SET smth ='".$smth_email."' WHERE user = '".$smth_user."'"; 

mysql_query($sql1); 
mysql_query($sql2);  
?> 

如果一個人知道我的表的結構(或想通了不知),他們可以「注入」 SQL到我的查詢通過把SQL文本導入到表單字段中,導致我的SQL變量字符串看起來像用分號分隔的兩個有效查詢。例如,有人可能會輸入到「水木清華」的表單字段是這樣的:

';DELETE FROM table_name WHERE 1=1 OR smth=' 

,然後$ SQL1最終會看起來像:

SELECT * FROM table_name WHERE smth = '';DELETE FROM table_name WHERE 1=1 OR smth='' 

...還有來自雲中的所有數據TABLE_NAME。

這就是爲什麼PHP中有像mysql_escape_string這樣的函數來幫助防止這些類型攻擊中的字符串。如果你知道一個變量應該是一個數字,把它轉換成一個數字。如果您有文本,請將其包裝在字符串轉義函數中。這是如何防守的基本想法。