3 回答

TA貢獻(xiàn)1834條經(jīng)驗(yàn) 獲得超8個(gè)贊
從MySQL的C API函數(shù)mysql_real_escape_string
描述:
如果需要更改連接的字符集,則應(yīng)使用
mysql_set_character_set()
函數(shù)而不是執(zhí)行SET NAMES
(或SET CHARACTER SET
)語句。mysql_set_character_set()
的工作方式類似,SET NAMES
但也會(huì)影響所使用的字符集mysql_real_escape_string()
,而SET NAMES
不會(huì)。
因此,請勿使用SET NAMES
/,SET CHARACTER SET
而應(yīng)使用PHPmysql_set_charset
來更改編碼,因?yàn)樗cMySQL的編碼相對應(yīng)mysql_set_character_set
(請參見/ext/mysql/php_mysql.c的源代碼)。

TA貢獻(xiàn)1845條經(jīng)驗(yàn) 獲得超8個(gè)贊
但是,即使使用舊代碼和舊服務(wù)器版本,也只有在數(shù)據(jù)庫連接的字符集從單字節(jié)(如Latin-1)更改為允許值0x5c(ASCII單引號)的多字節(jié)時(shí),才能觸發(fā)此漏洞。 )放在多字節(jié)字符的第二個(gè)字節(jié)或更高字節(jié)中。
具體來說,與GBK和SJIS之類的較舊的亞洲編碼不同,UTF-8不允許這樣做。因此,如果您的應(yīng)用程序不更改連接字符集,或僅將其更改為UTF-8或諸如Latin-n的單字節(jié)字符集,則可以免受這種攻擊。
但是最佳實(shí)踐仍然是運(yùn)行最新的服務(wù)器版本,使用正確的界面來更改字符集,并使用準(zhǔn)備好的查詢,這樣您就不會(huì)忘記轉(zhuǎn)義。

TA貢獻(xiàn)1906條經(jīng)驗(yàn) 獲得超3個(gè)贊
在注釋中有一個(gè)指向mySQL 5.0.22(2006年5月24日)中的錯(cuò)誤修正的鏈接,此問題已得到解決。
添加回答
舉報(bào)