我試圖評估一種定製CMS
。在防止SQL
攻擊中使用的devoloper是:這個字符串是否能夠抵抗SQL注入攻擊?
str_replace("'", "\'", $_POST[$variable]);
這是不夠好,或有正在如何利用這個注入SQL
代碼?
PS:我知道標準的方法是使用mysql_real_escape_string()
,但我想了解一般的代碼質量。
我試圖評估一種定製CMS
。在防止SQL
攻擊中使用的devoloper是:這個字符串是否能夠抵抗SQL注入攻擊?
str_replace("'", "\'", $_POST[$variable]);
這是不夠好,或有正在如何利用這個注入SQL
代碼?
PS:我知道標準的方法是使用mysql_real_escape_string()
,但我想了解一般的代碼質量。
str_replace("'", "\'", $_POST[$variable]);
是的,這是脆弱的。
一般來說,反斜槓並沒有被轉義,所以你可以使用反斜線來打破字符串字面值來掩蓋引用:hello\' OR 1 --
- >'hello\\' OR 1 --'
。
空也沒有逃脫,可能會導致問題。
此外,如果東亞字符集正在使用中,可能會使用多字節序列來掩蓋引用。 (請注意,對於UTF-8,情況並非如此,因爲UTF-8不允許'
作爲尾隨字節。)
此外,此轉義格式僅適用於MySQL。如果使用任何其他數據庫,或者在MySQL中使用了ANSI兼容的字符串文字選項,則它將無效,因爲標準轉義是將報價加倍,而不是反斜槓。
該代碼是無用的。最好的情況是它表明有人知道存在SQL注入,但它並沒有真正理解實際問題。
No.扔在一些UTF8字符,這會或者篡改代碼或逃脫。
使用mysqli/PDO或者必須使用mysql_real_escape_string。
如果他們自己製作而不是使用標準功能,我不會相信代碼庫的其餘部分。 –
您應該添加「準備好的語句」;如果你編寫這樣的代碼,只是切換到mysqli或PDO並沒有多大幫助... – jeroen
SQL注入可以有多種形式。
如果有一個查詢在數字字段上執行where子句(認爲PIN碼),它可以很容易地注入。
東西無害尋找用戶輸入的號碼匹配:
SELECT * FROM table
WHERE ID = 1
可能演變中的東西,總是匹配
SELECT * FROM table
WHERE ID = 1 OR 1 = 1
使用供應商特定的逃生功能或準備語句是這樣的去。
如果有人進入'\''那麼你的逃脫將無法正常工作嗎?這變成''''''(轉義引號)後跟''(轉義引用) –
標準方式不是'mysql_real_escape_string',實際上'mysql_ *'已經(最後)開始了棄用過程。標準的方式是使用準備好的語句。看看'PDO'和'mysqli_ *' –
如果出現這種車輪重新發明,這是一個非常糟糕的跡象。 – tadman