【发布时间】:2014-10-07 21:27:41
【问题描述】:
我终于可以创建一种方法来重现我遇到的错误。当 2 个或更多用户同时调用一个页面时,modsecurity 会为两个用户生成相同的随机数序列(使用 php 的 rand() 函数)。
这是一个错误的演示:
http://quemfazsite.com.br/em_criacao/modelo9/teste.php
打开此页面,将加载 2 个 iframe,每个 iframe 都应该相互独立地生成随机数,但两个框架都生成相同的随机数序列!下面可以看到非常简单的源代码。如果您没有看到相同的序列,我会要求您重新加载页面几次,直到您获得相同的数字序列。
编辑:此错误仅在 modsecurity 激活时发生。如果您评论加载 modsecurity 的“LoadModule”行,则不会发生错误!
<?php
if (isset($_GET["test"])) {
$output= "";
for ($i=0;$i<10;$i++) {
$output.= rand(0,99999999) . "<br />";
}
echo $output;
exit();
}
?>
<iframe src="PUT_THE_SAME_NAME_OF_THIS_FILE_HERE.php?test&953487"></iframe>
<iframe src="PUT_THE_SAME_NAME_OF_THIS_FILE_HERE.php?test&234322"></iframe>
【问题讨论】:
-
您的问题与 modsecurity 模块或 apache 完全无关。我删除了相应的标签。
-
如前所述,它与 modsecurity 无关......这是随机数生成器的种子问题,这就是文档建议不要再使用 rand() 的原因跨度>
-
It's not mod_security。如果您没有使用不同的种子调用
srand(),那么 PHP 将使用当前的time()为其 PRNG 播种,这意味着如果您在同一秒内调用两个调用,您将获得相同的结果。 -
Welp,享受追逐那只大雁的乐趣。我要去调查一个相关的问题,即每当我穿毛衣时,我的车的油耗会变差。