java 宽字节_宽字节注入
寬字節(jié)注入
原理:寬字節(jié)(兩字節(jié))帶來的安全問題主要是吃ASCII字符(一字節(jié))的現(xiàn)象,使用一些特殊字符來”吃掉“經(jīng)過轉(zhuǎn)義符 “ \ ” 。
在重新詳細(xì)了解寬字節(jié)注入之前,我認(rèn)為寬字節(jié)注入只是出現(xiàn)在網(wǎng)站使用GBK編碼的時(shí)代,現(xiàn)在已經(jīng)很少出現(xiàn)了,但是實(shí)際上寬字節(jié)不只是出現(xiàn)在GBK編碼中。
在PHP中,通過iconv()進(jìn)行編碼轉(zhuǎn)換時(shí),也可能出現(xiàn)寬字節(jié)注入。
還有一個(gè)誤區(qū):
這里的編碼問題不是出現(xiàn)在HTML頁面編碼,而是與數(shù)據(jù)庫(kù)的編碼形式有關(guān),一般我們?cè)诮⒁粋€(gè)數(shù)據(jù)庫(kù)的時(shí)候會(huì)讓我們選擇數(shù)據(jù)庫(kù)的編碼形式,所以有時(shí)候網(wǎng)站雖然是UTF-8寫的,但是如果數(shù)據(jù)庫(kù)是GBK的形式,也會(huì)出現(xiàn)寬字節(jié),現(xiàn)實(shí)這樣建站的奇葩應(yīng)該很少叭。。。
寬字節(jié)編碼有哪些:
GB2312、GBK、GB18030、BIG5、Shift_JIS等這些都是常說的寬字節(jié)
MySQL中用于轉(zhuǎn)義的函數(shù)有:
addslashes、mysql_real_escape_string、mysql_escape_string以及后面在高版本被去除的magic_quote_gpc
繞過思路:
因?yàn)閷捵止?jié)注入主要是吃掉 \ ,所以一般時(shí)候加一個(gè) %df 這種就可以吃掉,其實(shí)加三個(gè)%df也可以吃掉,只要是奇數(shù)個(gè)%df即可。
防御方法:
1.設(shè)置character_set_client=binary,將數(shù)據(jù)以二進(jìn)制形式傳遞
2.矯正人們對(duì)于mysql_real_escape_string的誤解,單獨(dú)調(diào)用set names gbk和mysql_real_escape_string是無法避免寬字符注入問題的。還得調(diào)用mysql_set_charset來設(shè)置一下字符集。
3.謹(jǐn)慎使用iconv來轉(zhuǎn)換字符串編碼,很容易出現(xiàn)問題。只要我們把前端html/js/css所有編碼設(shè)置成gbk,mysql/php編碼設(shè)置成gbk,就不會(huì)出現(xiàn)亂碼問題。不用畫蛇添足地去調(diào)用iconv轉(zhuǎn)換編碼,造成不必要的麻煩。
參考連接:
1
2
總結(jié)
以上是生活随笔為你收集整理的java 宽字节_宽字节注入的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java avl_Java底层实现AVL
- 下一篇: java链表list_java集合之li