読者です 読者をやめる 読者になる 読者になる

PHPをparse_strで殴り続けると死ぬ

$ php -r 'parse_str(implode("&a", range(0,1000)), $x);'                                          [~]
PHP Warning:  parse_str(): Input variables exceeded 1000. To increase the limit change max_input_vars in php.ini. in Command line code on line 1
PHP Stack trace:
PHP   1. {main}() Command line code:0
PHP   2. parse_str() Command line code:1


_人人 人人_
> 突然の死 <
 ̄Y^Y^Y^Y ̄

$ php -d max_input_vars=1 -r 'parse_str("a&b", $x);'                                             [~]
PHP Warning:  parse_str(): Input variables exceeded 1. To increase the limit change max_input_vars in php.ini. in Command line code on line 1
PHP Stack trace:
PHP   1. {main}() Command line code:0
PHP   2. parse_str() Command line code:1


oh, my..

parse_str() が使用している仕組みは PHP が $_GET や $_POST などの設定に使用しているものと同じ
http://php.net/manual/ja/function.parse-str.php

That's not says in the description but max_input_vars directive affects this function.
http://www.php.net/manual/ja/function.parse-str.php#108642


max_input_varsは昨年導入されました
参考:Webアプリケーションに対する広範なDoS攻撃手法(hashdos)の影響と対策
- http://blog.tokumaru.org/2011/12/webdoshashdos.html
参考:DoS回避用の max_input_vars が出てきました
- http://d.hatena.ne.jp/gallu/20120111/p1