当前位置:  开发笔记 > 编程语言 > 正文

/ dev/urandom错误(webhost拒绝权限)

如何解决《/dev/urandom错误(webhost拒绝权限)》经验,为你挑选了1个好方法。

我正在使用功能:

private function random($len) {
        if (@is_readable('/dev/urandom')) {
            $f=fopen('/dev/urandom', 'r');
            $urandom=fread($f, $len);
            fclose($f);
        }

        $return='';
        for ($i=0;$i<$len;++$i) {
            if (!isset($urandom)) {
                if ($i%2==0) mt_srand(time()%2147 * 1000000 + (double)microtime() * 1000000);
                $rand=48+mt_rand()%64;
            } else $rand=48+ord($urandom[$i])%64;

            if ($rand>57)
                $rand+=7;
            if ($rand>90)
                $rand+=6;

            if ($rand==123) $rand=52;
            if ($rand==124) $rand=53;
            $return.=chr($rand);
        }
        return $return;
    }

我有一些触发此功能的表单,我收到错误:

int(2)string(200)"is_readable():open_basedir限制生效.文件(/ dev/urandom)不在允许的路径内:

有没有办法替换这个功能而不使用/dev/urandom?非常感谢你.



1> Scott Arcisz..:

从(以前接受的)答案:

你可以使用"rand"而不是urandom:

Nooooooooo!


处理open_basedir是我们在random_compat中优雅处理的事情之一.认真考虑导入该库然后只使用random_bytes()而不是从/ dev/urandom读取.

无论你做什么,都不要使用rand().即使你认为它有一个用例,安全权衡也是一个谎言.

此外,如果您需要一个函数来生成随机字符串(取决于PHP 7或random_compat):

/**
 * Note: See https://paragonie.com/b/JvICXzh_jhLyt4y3 for an alternative implementation
 */
function random_string($length = 26, $alphabet = 'abcdefghijklmnopqrstuvwxyz234567')
{
    if ($length < 1) {
        throw new InvalidArgumentException('Length must be a positive integer');
    }
    $str = '';
    $alphamax = strlen($alphabet) - 1;
    if ($alphamax < 1) {
        throw new InvalidArgumentException('Invalid alphabet');
    }
    for ($i = 0; $i < $length; ++$i) {
        $str .= $alphabet[random_int(0, $alphamax)];
    }
    return $str;
}

演示代码:https://3v4l.org/DOjNE

推荐阅读
携手相约幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有