簡體   English   中英

mysql_real_escape_string無法轉義特殊字符,因為文本來自文本編輯器

[英]mysql_real_escape_string fails to escape special chars as text comes from text editor

我正在創建一個頁面,用戶可以在其中輸入commnet,並將注釋插入到DB(mysql)中。 這些注釋可以包含單引號,雙引號或任何特殊字符。 為了逃避這些,我使用了以下代碼

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

這里$ conn是活動的連接資源,$ str是textarea中的字符串內容

這可以正常工作,並返回我可以插入數據庫的完美轉義的字符串。 但是,如果用戶在諸如openoffice writer或msword之類的文本編輯器中輸入了他/她的注釋並使用了其中的文本,則會發生錯誤,並在插入DB時給出如下錯誤

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

我認為這是因為文本編輯器(openoffice,msword)中的單雙引號無法正確轉義。 因此,我如何轉義將其插入數據庫。 請幫我

提前致謝.....

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

例如

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

即使code是BLOB類型的二進制字段,而$ code是完整的二進制數據(例如,圖像文件內容),此方法也有效。

您還將避免使用此方法進行任何sql注入。 我發現使用sprintf格式化查詢是極其強大和安全的,並且使用php bin2hex()可以使包括二進制在內的任何內容都能不受污染地進入數據庫。

搞清楚它是您的另一件事。

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

大概您的用戶正在通過網頁提交文本-您需要確保以UTF8的形式提供頁面,並且在提交表單時也以UTf8形式提供(如果以UTF8的形式提供頁面,則默認情況下) 。

你需要:

確保您在標題中發送了UTF-8字符集。

header(“ Content-Type:text / html; charset = UTF-8”);

和/或在頁面的部分中設置內容類型

順便說一句,mysql_real_escape_string與這里的問題無關。 該函數用於防止將包含普通引號的字符串用於SQL注入攻擊,無論如何,通過使用准備好的語句可以更好地解決此問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM