雖然將密碼轉換爲二進制哈希以存儲在數據庫中,但我注意到除了通常的亂碼之外,還有一些引號,空格和字母表,這些符號可能構成有效SQL語句的一部分。構成SQL語句一部分的二進制散列?
出於好奇,我想知道是否有人遇到這神奇轉變成散列時一個有效的SQL語句的一部分,無論是通過MD5,SHA1等
添加備註任何字符串:雖然這個問題可能與安全有關,它更像是一個好奇的問題,因爲我已經知道如何防禦注入攻擊。
雖然將密碼轉換爲二進制哈希以存儲在數據庫中,但我注意到除了通常的亂碼之外,還有一些引號,空格和字母表,這些符號可能構成有效SQL語句的一部分。構成SQL語句一部分的二進制散列?
出於好奇,我想知道是否有人遇到這神奇轉變成散列時一個有效的SQL語句的一部分,無論是通過MD5,SHA1等
添加備註任何字符串:雖然這個問題可能與安全有關,它更像是一個好奇的問題,因爲我已經知道如何防禦注入攻擊。
如果散列摘要的二進制字節形成任何合法的SQL語法,那將是非常奇怪的。它很可能會創建無效的語法,並且您的查詢會產生錯誤。
每個數據庫API都具有保護您的查詢免受由於字符串文字中的特殊字符而造成的無意的錯誤語法的功能。你需要學習如何使用它們。例如,如果您使用PHP,請使用MySQLi或PDO擴展。使用參數佔位符準備查詢,並將散列字符串作爲查詢參數發送。
如果使用其他語言,也存在類似的功能。
回覆意見:
我更喜歡使用,而不是逃避查詢參數,因爲它可以用於任何數據類型,它不會從字符編碼錯誤受苦,它更容易代碼。
有些情況下,轉義和查詢參數都不起作用。表名,列名,IN()謂詞的值列表,SQL關鍵字,表達式。在我的演示文稿SQL Injection Myths and Fallacies中,我介紹了一種我稱之爲「白名單映射」的方法,它有助於涵蓋像這樣的特殊情況。
我還在我的書SQL Antipatterns: Avoiding the Pitfalls of Database Programming中介紹了SQL注入。
string hash = Hash(password);
string sql = "update users set passwordHash = '" + hash +
"' WHERE userID = " + userID;
它非常危險:
你應該永遠與可將數據添加到數據庫中。這種類型的場景對於SQL注入攻擊也很常見。 要安全和正確地做到這一點,你應該使用參數。
string hash = Hash(password);
string sql = "update users set passwordHash = @hash WHERE userID = @userID";
using (var cmd = new SqlCommand(sql, dbConn))
{
cmd.Parameters.Add("@userID", SqlDbType.Int).Value = userID;
cmd.Parameters.Add("@hash", SqlDbType.VarChar).Value = hash;
cmd.ExecuteScalar();
}
是的,'PDO'和'mysqli_real_escape_string'足以阻止任何注入攻擊。我對這個非凡非常好奇。 –
請注意,'mysqli_real_escape_string()'不在Bill的建議之中,有一個很好的理由:它是從PHP注入參數最古老也是最煩人的方式。 –
@ÁlvaroG. Vicario:'mysqli_real_escape_string'有什麼不好? –