2011-10-24 37 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