PHP是一种动态类型的脚本语言,诞生于上世纪90年代初,极为适合用来开发Web应用程序。其中重要的一块就是伪随机数生成器(PRNG)。伪随机数生成器是计算机程序中常用的一种随机数生成器,这些生成器生成的数列并非真正的随机数,而是在统计学意义上看起来是随机数。由于这些生成器在计算中依赖于某个已知的数字,称为“种子”,所以被称为伪随机数生成器。在PHP中,可以使用rand()和mt_rand()两个函数生成随机数。
rand()函数的使用格式为:
```php
int rand ( int $min , int $max )
```
该函数返回一个在$min和$max之间的随机整数。如果只包含一个参数,则默认为0和RAND_MAX(最大的伪随机数)之间的随机整数。但是,rand()函数在生成随机数时是依赖于当前时间的,所以生成的随机数是不可预测的。
另一个常用的随机数生成函数是mt_rand()。它使用更快的算法生成伪随机数,因此在大量生成随机数时比rand()更快。使用它的格式为:
```php
int mt_rand ( int $min , int $max )
```
与rand()一样,该函数返回一个在$min和$max之间的随机整数。如果只包含一个参数,则默认为0和MT_RAND_MAX(最大的伪随机数)之间的随机整数。
爆破PRNG种子
PRNG生成随机数是基于种子,也就是一个可以充当起始值的数据,然后通过一定的算法来生成随机数。如果我们能知道PRNG使用的种子,我们就可以知道它将生成什么样的随机数。这就是PRNG种子的重要性。
爆破PRNG种子的方法很简单:只需要逐个尝试候选种子,然后使用该种子生成一系列随机数,看它是否与我们需要的一致。由于PRNG生成的随机数是不可预测的,所以这是有效的攻击方式。
这里提供一段使用rand()函数实现的爆破种子的示例代码。我们假设我们知道生成的随机数是0到10之间的整数,然后通过暴力破解来尝试种子。
```php
$secretNumber = 8; // our target random number
for ($seed=0; $seed<=RAND_MAX; $seed++) {
srand($seed);
if (rand(0, 10) === $secretNumber) {
echo "The secret number is: $secretNumber (seed=$seed)";
break;
}
}
?>
```
在这个示例代码中,我们使用了一个循环,从0到RAND_MAX之间的所有整数进行尝试(RAND_MAX是一个常量,表示能够生成的最大的伪随机数)。然后每个种子都会用来生成一个随机数,如果这个随机数与我们需要的随机数匹配,说明我们找到了种子。
此方法是可行的,但是在实践中不够实用,因为随机数生成器的种子通常是通过当前时间或者其他系统参数生成的。即使我们在知道应用程序如何生成伪随机数的情况下,也很难在短时间内爆破出种子。因此,想要成功爆破PRNG的种子,需要付出极大的努力。
注册全局函数
PHP提供了一种非常方便的机制来注册全局函数。也就是说,开发者可以通过一条语句在整个应用程序中注册一个函数。注册一个全局函数可以避免在多个文件中多次定义同一个函数的工作,这大大简化了代码的维护和开发过程。下面是如何注册一个全局函数的示例代码:
```php
function myGlobalFunction() {
echo "This is a global function\n";
}
// register the function as a global function
$functionName = "myGlobalFunction";
$methodName = "myMethod"; // also works for class methods
$callable = (is_null($methodName)) ? $functionName : array($className, $methodName);
$registered = register_shutdown_function($callable);
?>
```
在这个示例代码中,我们定义了一个函数myGlobalFunction(),然后使用了register_shutdown_function()函数把它注册为一个全局函数。这个函数在应用程序处理完成后调用。
请注意,我们使用了一个可选参数$methodName来在函数中注册一个类方法。如果你想注册一个类方法,只需要在$methodName参数中指定方法名即可。在这种情况下,$registerd变量将返回TRUE,否则返回FALSE。
总结
在PHP中,伪随机数生成器提供了随机数的生成,但是由于生成的是伪随机数,所以在安全性要求较高的场景中必须格外小心。特别是当应用程序使用默认的种子(例如,当前时间戳)来生成随机数时,它们可以很容易地被攻击者预测。此外,注册全局函数也是一个很实用的技巧。当需要在整个应用程序中重复使用同一个函数时,注册全局函数可以大大简化代码的开发和维护。 如果你喜欢我们三七知识分享网站的文章, 欢迎您分享或收藏知识分享网站文章 欢迎您到我们的网站逛逛喔!https://www.ynyuzhu.com/
把你丢进外太空都对得住你这个怂人了,要不然一定会让你去魔域里历练历练。