2012-07-26 14 views
3

我使用這個目前停在文字區域子彈,但它似乎並不奏效子彈:試圖進入我的數據庫爲特殊字符

function sanitizeMySQL($var){ 
     $var = mysql_real_escape_string($var); 
     $var = sanitizeString($var); 
     return $var; 
} 

function sanitizeString($var) 
{ 
    $var = str_replace('•','•', $var); 
    $var = htmlentities($var); 
    $var = strip_tags($var); 
    return $var; 
} 

這是子彈出現像我有人後DB提交他們通過一個文本:

•

編輯:這是什麼現在我得到:•

我確實有子彈存儲在我的分貝,所以我知道它允許他們。用拉丁-1編碼存儲子彈是否有正確的方法?

+1

您的表是否使用latin-1編碼?因爲我相當肯定圓形子彈是UTF-8的東西。 – Palladium 2012-07-26 17:15:56

+0

這是一個編碼問題。什麼編碼是你的網頁,你在數據庫中使用什麼編碼?注意:'strip_tags()'和'htmlentities()'對數據庫衛生沒有必要,請參閱[終極乾淨/安全功能](http://stackoverflow.com/q/4223980)/ – 2012-07-26 17:16:34

+0

您應該真正清理字符串**之前**你逃脫它。我很確定JS可以通過這個甚至SQL來注入。 – Vatev 2012-07-26 17:19:14

回答

2

通過表單和源代碼提交的數據沒有相同的編碼。因此源代碼中的•字符與實際數據中的字符不匹配。因此他們沒有被替換。統一使用通用編碼。見Handling Unicode Front To Back In A Web App

另外,您的消毒策略很奇怪。我不知道你對「?」有什麼反應,這不應該在一般的「消毒」功能中取代。此外,你首先HTML轉義的一切,然後剝離標籤。提示:在你逃脫之後不會有任何標籤。接下來,在您將SQL轉義出來之後,您不應該再修改該字符串。見The Great Escapism (Or: What You Need To Know To Work With Text Within Text)

+0

所以你會推薦我改變我的數據庫或頁面的編碼?此外,我已將衛生功能更改爲:'function sanitizeMySQL($ val){val; htmlentities($ val);}} \t \t \t $ val = strip_tags($ val); \t \t \t $ val = mysql_real_escape_string($ val); \t \t \t return $ val; \t}' – sixshift04 2012-07-26 19:46:37

+1

同樣,*源代碼的編碼*和提交數據的編碼看起來不匹配。 'htmlentities'後的'strip_tags'仍然是無稽之談,你可能不需要。 – deceze 2012-07-26 20:36:29

+0

在整個鏈中使用UTF8會更好嗎? – sixshift04 2012-07-26 21:09:28

相關問題