gpt4 book ai didi

php - 此PHP代码是否会使其他人的Apache崩溃?

转载 作者:行者123 更新时间:2023-12-03 15:52:31 25 4
gpt4 key购买 nike

preg_match_all('/(a)*/', str_repeat('a', 1000), $matches);

(编辑:稍微修改正则表达式以使其更简单而仍然崩溃)

我在带有Apache 2.0的PHP 5.3.5上运行它,它使服务器崩溃。如果我将339更改为338,则它不再崩溃,因此对我来说似乎是个错误。我尝试将其报告给 http://bugs.php.net/,但已失败。这是PHP错误吗?它会崩溃吗?

编辑:将代码更改为
preg_match_all('/(?:a)*/', str_repeat('a', 339), $matches);

允许在崩溃前使用更长的字符串。
如果它没有崩溃,请尝试将字符串长度增加10或100倍,因为这可能是内存问题,并且您可能有更多内存。

编辑2:该崩溃是一个完整的进程崩溃,在Windows 7上,执行后我立即收到“End task”消息。

编辑3:如果崩溃是由于过多的回溯导致的,并且上面的示例显然可以导致崩溃,则以下内容不应导致:
preg_match('/[^"\']*(;|$)/',
str_repeat('x', 1000), $matches);

这是我崩溃的实际代码。这只是为了通过 ;拆分多个SQL查询,同时允许在单引号或双引号中包含 ;。为什么这会造成大量回溯,我该如何解决?

最佳答案

问题不在于内存或执行时间...

ini_set('pcre.backtrack_limit', 10000);

随意设置 ,如有必要,将的10000减小为其他值。有关更多信息,请参见 http://php.net/manual/en/pcre.configuration.php

如果您想测试崩溃的地方:
<?php

ini_set('pcre.backtrack_limit', 10000);

for ( $i = 1; $i < 65535; $i++ )
{
echo $i . PHP_EOL;
preg_match_all('/(a)*/', str_repeat('a', $i), $matches);
}

?>

关于php - 此PHP代码是否会使其他人的Apache崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6382330/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com