![](/img/trans.png)
[英]mysql_real_escape_string and html_special_chars enough?
[英]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.