2015-10-06 83 views
-4

爲什麼MySQL更容易受到SQL注入攻擊?爲什麼MySQL更容易受到SQL注入攻擊

我一直在尋找這個問題的最後兩天的完美答案,但徒勞無功。如果您可以根據SQL注入漏洞和安全性將MySQL與其他數據庫進行比較,那將會更好。 PS:我非常瞭解MySQL和SQL注入攻擊。請嘗試瞭解問題的全部內容。

+0

任何人都可以提供答案,而不是投票下來? –

+0

看看這個http://www.rackspace.com/knowledge_center/article/sql-injection-in-mysql –

+0

另請參閱:[MySQL是否比Perl DBI下的PostgreSQL更能抵抗SQL注入攻擊?](http:// stackoverflow.com/questions/2221787/is-mysql-more-resistant-to-sql-injection-attack-than-postgresql-under-perl-dbi) – Paul

回答

3

爲什麼MySQL的SQL注入攻擊

更容易MySQL是不是。從來沒有過。

MySQL不會比其他任何DBMS更易受影響。 這不是魔杖,它是精靈,你知道的。它不是mysql,但它的用戶更容易受到SQL注入攻擊。

就是這樣。

而用戶的問題仍然存在,正如其他答案生動地表明的那樣。遵循其建議(php/mysql人員中非常常見,介意你),很快你就會享受到一流的SQL注入。

+0

好的。它可能不在當前場景中。但爲什麼在更早的時候呢? –

+1

@Rohit:如上所述,它從來沒有。事實上,由於不支持大多數界面中的多個語句,因此它比許多弱點更容易受到攻擊,這限制了輕鬆攻擊的範圍。 MySQL在沒有經驗的PHP編程人員中很受歡迎;這是關於它的一切。 – bobince

-3

什麼是SQL注入

SQL注入是指有人將一個MySQL聲明不知情的情況下你的數據庫上運行的行爲。注入通常發生在你向用戶詢問輸入時,如他們的名字,而不是他們給你一個名字,而不是你在數據庫上不知不覺中運行的MySQL語句。

SQL注入實例

雖然上面的例子中顯示的情況下,攻擊者可能可以獲得訪問了很多,他們不應該有信息,該攻擊可以差很多。例如,攻擊者可以通過執行DELETE語句清空表。

MySQL和代碼

$name_evil = "'; DELETE FROM customers WHERE 1 or username = '"; 

// our MySQL query builder really should check for injection 
$query_evil = "SELECT * FROM customers WHERE username = '$name_evil'"; 

// the new evil injection query would include a DELETE statement 
echo "Injection: " . $query_evil; 

顯示

SELECT * FROM customers WHERE username = ' '; DELETE FROM customers WHERE 1 or username = ' ' 

如果你在運行此查詢,那麼注入的DELETE語句會完全排空你的 「客戶」 表。現在你知道這是一個問題,你怎麼能阻止它?

注射預防 - mysql_real_escape_string()

幸運的是,這個問題已經知道了一段時間,PHP有一個特製的功能,以防止這些攻擊。所有你需要做的就是使用函數mysql_real_escape_string的滿口。

mysql_real_escape_string的作用是取一個將在MySQL查詢中使用的字符串,並返回相同的字符串,並且所有SQL注入嘗試都安全地轉義。基本上,它將取代那些用戶可能使用MySQL安全替代品(逃脫報價)輸入的麻煩引號(')。

讓我們在我們之前的兩次注入攻擊中試用這個函數,看看它是如何工作的。

的MySQL & PHP代碼

//NOTE: you must be connected to the database to use this function! 
// connect to MySQL 

$name_bad = "' OR 1'"; 

$name_bad = mysql_real_escape_string($name_bad); 

$query_bad = "SELECT * FROM customers WHERE username = '$name_bad'"; 
echo "Escaped Bad Injection: <br />" . $query_bad . "<br />"; 


$name_evil = "'; DELETE FROM customers WHERE 1 or username = '"; 

$name_evil = mysql_real_escape_string($name_evil); 

$query_evil = "SELECT * FROM customers WHERE username = '$name_evil'"; 
echo "Escaped Evil Injection: <br />" . $query_evil; 

顯示

Escaped Bad Injection: 
SELECT * FROM customers WHERE username = '\' OR 1\'' 
Escaped Evil Injection: 
SELECT * FROM customers WHERE username = '\'; DELETE FROM customers WHERE 1 or username = \'' 

注意,那些邪惡的報價已經越獄以反斜線\,防止注入攻擊。現在所有這些查詢都會嘗試找到一個完全荒謬的用戶名: •錯誤:\'OR 1 \' •Evil:\';刪除客戶WHERE 1或用戶名= \'

我認爲我們不必擔心那些愚蠢的用戶名訪問我們的MySQL數據庫。所以請使用方便的mysql_real_escape_string()函數來幫助防止您網站上的SQL注入攻擊。閱讀本課後,你沒有理由不使用它!

+0

我很清楚SQL注入攻擊和MySQL。你能回答這個問題嗎? –

+0

閱讀我的答案,它有如何防止它在MySQL中。 –

+0

我不是在談論緩解。我的問題很簡單:「爲什麼可以對MySQL執行SQL注入攻擊?」 –