2012-09-26 33 views
3

我試圖評估一種定製CMS。在防止SQL攻擊中使用的devoloper是:這個字符串是否能夠抵抗SQL注入攻擊?

str_replace("'", "\'", $_POST[$variable]); 

這是不夠好,或有正在如何利用這個注入SQL代碼?

PS:我知道標準的方法是使用mysql_real_escape_string(),但我想了解一般的代碼質量。

+2

如果有人進入'\''那麼你的逃脫將無法正常工作嗎?這變成''''''(轉義引號)後跟''(轉義引用) –

+1

標準方式不是'mysql_real_escape_string',實際上'mysql_ *'已經(最後)開始了棄用過程。標準的方式是使用準備好的語句。看看'PDO'和'mysqli_ *' –

+0

如果出現這種車輪重新發明,這是一個非常糟糕的跡象。 – tadman

回答

6
str_replace("'", "\'", $_POST[$variable]); 

是的,這是脆弱的。

一般來說,反斜槓並沒有被轉義,所以你可以使用反斜線來打破字符串字面值來掩蓋引用:hello\' OR 1 -- - >'hello\\' OR 1 --'

空也沒有逃脫,可能會導致問題。

此外,如果東亞字符集正在使用中,可能會使用多字節序列來掩蓋引用。 (請注意,對於UTF-8,情況並非如此,因爲UTF-8不允許'作爲尾隨字節。)

此外,此轉義格式僅適用於MySQL。如果使用任何其他數據庫,或者在MySQL中使用了ANSI兼容的字符串文字選項,則它將無效,因爲標準轉義是將報價加倍,而不是反斜槓。

該代碼是無用的。最好的情況是它表明有人知道存在SQL注入,但它並沒有真正理解實際問題。

8

No.扔在一些UTF8字符,這會或者篡改代碼或逃脫。

使用mysqli/PDO或者必須使用mysql_real_escape_string。

+5

如果他們自己製作而不是使用標準功能,我不會相信代碼庫的其餘部分。 –

+0

您應該添加「準備好的語句」;如果你編寫這樣的代碼,只是切換到mysqli或PDO並沒有多大幫助... – jeroen

1

SQL注入可以有多種形式。

如果有一個查詢在數字字段上執行where子句(認爲PIN碼),它可以很容易地注入。

東西無害尋找用戶輸入的號碼匹配:

SELECT * FROM table 
WHERE ID = 1 

可能演變中的東西,總是匹配

SELECT * FROM table 
WHERE ID = 1 OR 1 = 1 

使用供應商特定的逃生功能或準備語句是這樣的去。