2012-01-10 64 views
1

我創建頁面,其中用戶輸入commnets和評論插入到數據庫(MySQL)。這些註釋可以包含單引號,雙引號或任何特殊字符。爲了逃避這些我用下面的代碼mysql_real_escape_string無法轉義特殊字符作爲文本來自文本編輯器

$str = mysql_real_escape_string($str,$conn); 

這裏$康恩被有效連接資源,$ str是從textarea的

字符串內容能正常工作並返回完美逃脫字符串,我可以插入到數據庫中。但是,如果用戶鍵入他/她的意見到像OpenOffice的作家或MSWORD,並從它使用該文本的文本編輯器,發生並給出錯誤如下錯誤,而在DB插入

Incorrect string value: '\x93testi...' for column 'commnets' at row 1 

我認爲這正在發生,因爲單來自文本編輯器(openoffice,msword)的文本中的雙引號不能正確轉義。那麼如何轉義它才能將其插入到數據庫中。請幫我

在此先感謝.....

+0

你如何構建查詢? – Gumbo 2012-01-10 11:00:59

+0

用數據庫創建的字符集是什麼?我記得當數據庫不允許8位字符時有類似的問題。 – 2012-01-10 11:01:24

+3

您已省略的重要信息:encoding(UTF-8,Latin1,ASCII ...),原始字符串,轉義字符串和SQL查詢。 '0x93'是Latin-1中的'''字符,它在SQL語法中沒有任何特殊含義。 – 2012-01-10 11:03:58

回答

0

您還沒有提交有效的UTF8字符串保存在數據庫中。相反,它可能是一個特定於Windows的字符集。

假設您的用戶通過網頁提交文本 - 您需要確保您以UTF8格式提交頁面,並且在提交表單時也使用UTF8(默認情況下,如果頁面是以UTF8服務)。

您需要:

確保你發送的報頭中的UTF-8字符集。

header(「Content-Type:text/html; charset = UTF-8」);

和/或內容類型設置在您的網頁

順便說一句mysql_real_escape_string的部分是不是真的東西在這裏做的問題。該函數用於防止包含普通引號的字符串用於執行SQL注入攻擊,這可以通過使用準備好的語句來解決。

0

有一種方法可以避開所有這些real_escape malarkey並注入INTO sql實際提供的內容,也就是使用mysql的能力將任意長度的十六進制數解釋爲字符串。

例如

$query=sprintf("update module set code=0x%s where id='%d'", bin2hex($code), $id); 

這個工程即使code是BLOB類型的二進制領域和$代碼是完全二進制數據(例如,圖像文件的內容)。

你也將回避任何SQL注入與此。 我發現使用sprintf來格式化查詢是非常強大和安全的,並且使用php bin2hex()可以渲染包括二進制文件在內的任何內容,並且能夠進入數據庫未知狀態。

把它弄出來是另外一回事,請記住你..

相關問題