2011-10-24 38 views
4

我的網站完全轉換爲使用utf-8,(mysql,http頭文件,PHP mb_string等)。什麼是從我的PHP網站過濾無效的utf8?

我做了一些滲透測試,並試圖將無效的utf POST到其中一個腳本(使用BurpSuite)。

但是,當我發佈無效的utf,只是十六進制轉儲$ _POST var時,我發現在我嘗試使用mb_detect_encoding驗證它之前,無效的utf序列已經過清理。

這對我來說聽起來像個好消息,但我想知道哪一層正在轉換POST數據?

它是Content-Type HTTP Header的一個副作用,也許我的web服務器正在做它(lighttpd)。或者它是PHP自己做的,當填充$ _POST?

我期望看到無效的utf hexdumped,讓我自己消毒。

+0

有關更多信息,請參閱框架?你使用哪個PHP版本?我們可以看到你的代碼樣本等 –

+0

我們可以看到你發佈的內容和你回來的東西嗎? – Brad

+1

不,沒有框架。只需要vanilla PHP和來自burpsuite的原始HTTP請求,然後PHP腳本只需十六進制轉儲一個$ _POST [「formvalue」]。沒有預先處理$ _REQUEST/$ _ POST或在我的代碼中進行任何用戶輸入,然後進行十六進制轉儲 - 現在整理一個示例... – carpii

回答

1

PHP本身並不過濾POST數據,它只是將它作爲始終「有效」的二進制數據處理(它只是數據,無需驗證)。

因此,我會懷疑你的web服務器有一些模塊正在改變數據,或者有一些PHP擴展正在過濾數據。

檢查您的web服務器是否安裝了Web防火牆,以及您正在使用PHP加載的擴展列表以及是否存在與輸入篩選相關的內容。

+0

沒有框架,沒有web防火牆,顯然lighttpd不會嘗試過濾無效的utf8。我很困惑。沒有奇怪的擴展,雖然我正在通過這些工作。你知道任何可能導致它的mbstring配置設置嗎? – carpii

+0

mbstring有默認編碼,當然。你可能有那些註冊在輸入和/或輸出。請參閱[本答案中的** PHP設置**和**字符串**部分](http://stackoverflow.com/q/6987929/367456#6989048)。我列出了一些可以發揮作用的ini設置。爲了真正查看您處理的數據,我經常會發現[十六進制PHP字符串轉儲](http://stackoverflow.com/q/1057572/367456)方便。 – hakre

+0

謝謝,我最終發現它是由php.ini mbstring設置引起的...... mbstring.http_input = auto。當設置爲自動,它似乎進行無聲轉換字符集,這給人的印象是無效的UTF被妥善清理。我認爲更有可能的是,轉換失敗並返回空白字符串 – carpii