2011-08-12 105 views
1

如果我使用md5加密MYSQL注入,它會執行嗎?如果我在執行「mysql_real_escape_string」之前加密MYSQL注入,它將能夠清空mysql注入?我應該在加密之前運行「mysql_real_escape_string」嗎?MYSQL注入和md5加密

+1

加密注射是什麼意思?你有一個例子嗎? – Vache

+1

可能應該提及您正在明確地查看PHP解決方案,作爲標籤或問題主體本身。 – bdares

回答

2

md5() function返回一個包含ASCII字符0-9和a-f的字符串。 SQL注入需要使用像'"這樣的字符,因此考慮到算法的預期效果,由md5()生成的散列字符串不會導致SQL注入EVER。

因此,你可以寫這樣的事情不用擔心:

$username = mysql_real_escape_string($_POST['username']); 
$password = md5($_POST['password']); 
mysql_query("SELECT * FROM users WHERE user='$username' AND pass='$password'"); 

但它是一個很好的做法,總是逃避,你傳遞給你的查詢與mysql_real_escape_string()數據。

+0

請參閱我通常使用「sprintf()」,然後將mysql_real_escape_string作爲查詢的第二個參數。不知道我是否可以逃脫md5加密,但似乎我不需要擔心它,如果他們不能在編碼時惡意使用它 –

+0

'良好實踐'是爲了逃避所有不可信的teztual數據。 MD5返回可以被信任。不加區別地轉義所有數據會導致兩個問題:1.轉義並不總是清理數據的方式(思考數字)2.不是常見的事情,但實際上您可能會遇到「雙重轉義」問題。 – Mchl

+0

@Mchl:**所有**數據是不可信的,因爲它是由最不可信的實體 - 程序員處理的。這就是爲什麼逃避傳遞給SQL查詢的所有數據是一個好習慣。 – Dor

1

如果您使用MD5散列值,則不再包含任何惡意注入字符。 MySQL不會解碼MD5散列並將其解釋/執行爲SQL。實際上,MD5哈希不能被解碼,因爲它是單向算法。

+0

或者它的設計,但它不像預期的那麼強大。 – bdares

1

MD5散列值是二進制數據,在PHP中用十六進制表示。這意味着,它們只包含數字0..9和字母A..F。 這封信不可能進行SQL注入,所以你很安全。

1

MD5散列值本身不能導致SQL注入,但如果您嘗試避免SQL注入,則您的方法是原因之一的非常好的方法之一。

你特殊情況下,一類變量不能導致注入(MD5'd密碼),那麼你特殊情況下的另一個(例如事情評估爲整數),那麼你忘記哪些應該逃脫,哪些不是,你最後得到一個應該逃脫的微小的微不足道的變量,但是沒有人從你的團隊發現它......糟糕的是,你的代碼中存在一個真正的漏洞。

您避免轉義一個安全類,避免轉義第二個安全類,然後您錯誤地認爲第三個類也是安全的 - 事實證明,MD5是二進制編碼,有人設法找到用它來創建注入的方法...糟糕...你的代碼中還有一個更真實的漏洞。

您應該:

1)始終使用參數化查詢。這使得逃避不必要,並避免忘記逃離某些東西的風險。使用mysqlibind_param

$stmt = $db->prepare('insert into users (username, password) values (?, ?)'); 
$stmt->bind_param('ss', $name, md5($password)); 
$stmt->execute(); 

2)如果由於某種原因,你不能,什麼都逃不過。即使沒有必要。你不想忘記一些東西。

打擊SQL注入的規則是:不要試圖去了解什麼是安全的,什麼不是安全的,假設一切都是不安全的,並且把所有事情都視爲不安全。如果您將安全值視爲不安全,那麼程序仍然會正常運行,如果您將不安全的值視爲安全的,則您的程序將包含巨大的安全漏洞,並且一個錯誤就足夠了。

0

儘管通常md5哈希值不能用於注入攻擊,但值得指出的是raw md5哈希值可被利用。原始md5散列是使用 md5($userSubmittedValue, true)生成的散列 - 它們很脆弱,因爲輸出是一個可以包含非十六進制輸出的字符串。雖然在原始形式中生成散列並不常見,但重要的是要注意,技術上散列值可以在注入攻擊中被利用。

下面是它如何工作的一個示例:

http://cvk.posterous.com/sql-injection-with-raw-md5-hashes

至於其他人士指出,雖然十六進制MD5輸出不容易受到注入攻擊。