所以,我讀到有關SQL注入的文章,並有一個例子:SQL注入和兩個查詢
SELECT * FROM table_name WHERE smth = 'x';
UPDATE table_name SET smth ='[email protected]' WHERE user = 'admin';
爲什麼它不工作?或者這是一篇舊文章,現在這種方式是無稽之談?那麼黑客如何更新mysql呢? 謝謝。
所以,我讀到有關SQL注入的文章,並有一個例子:SQL注入和兩個查詢
SELECT * FROM table_name WHERE smth = 'x';
UPDATE table_name SET smth ='[email protected]' WHERE user = 'admin';
爲什麼它不工作?或者這是一篇舊文章,現在這種方式是無稽之談?那麼黑客如何更新mysql呢? 謝謝。
現在大多數網站都使用參數化的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」參數。
我的問題其實是: SELECT * FROM table_name WHERE smth ='x'; UPDATE table_name SET smth ='[email protected]'WHERE user ='admin'; 爲什麼這個查詢不起作用? – 2010-01-26 15:22:55
這取決於你如何執行上面的代碼。
許多代碼語言都有專用的數據庫通信類,您可以使用sql參數而不是串聯字符串。
SQL注入的風險是忘記在查詢中轉義某些用戶輸入,從而允許執行格式錯誤的查詢。
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,這種攻擊仍然可能發生。
DB 101對SQL注入進行了熱烈的警告,所以現在大多數開發人員都知道並阻止了它。這通常是通過使用某種預先準備好的語句完成的,其中通過防止任意SQL執行的機制注入參數。懶惰的編程仍然會導致漏洞,並且他們確實存在,但是,盲目的動態SQL構建更爲罕見且罕見。
當您有查詢「模板」並且需要用戶輸入來填寫某些查詢時,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這樣的函數來幫助防止這些類型攻擊中的字符串。如果你知道一個變量應該是一個數字,把它轉換成一個數字。如果您有文本,請將其包裝在字符串轉義函數中。這是如何防守的基本想法。
你的問題不是很清楚。你想獲得幫助,以在網頁上使用SQL注入? – Younes 2010-01-26 15:11:04
你在問什麼? – SLaks 2010-01-26 15:12:08
不知道原始查詢是看什麼注射將工作。看看我的答案在這裏http://stackoverflow.com/questions/332365/xkcd-sql-injection-please-explain/332367#332367有些人認爲它是如何工作的一個很好的解釋。至於你的特定文章,不能回答爲什麼它不起作用。 – Will 2010-01-26 15:15:16