0

fopen('/dev/urandom', 'rb') 可能由于多种原因而失败。也许“open_basedir 限制 [正在] 生效”或者 /dev/* 权限不允许 fopen() 读取它们。

事情是...... mcrypt_create_iv 使用 /dev/urandom:

https://github.com/php/php-src/blob/master/ext/mcrypt/mcrypt.c#L1391

我的问题是......如果 fopen() 失败 mcrypt_create_iv() 仍然可以工作吗?

对于 open_basedir 限制,我的假设是肯定的,但如果是权限呢?是否存在 fopen() 可能没有打开 /dev/urandom 所需权限但 mcrypt_create_iv 可以的情况?

4

2 回答 2

1

权限不会分配给函数,它们会根据用户、组或世界成员资格分配给进程(或者如果您使用 ACL,则可以进行更精细的控制)。

因此,如果您的进程fopen()以特定身份运行,则尝试使用或mcrypt_create_iv()open()在较低级别使用)打开文件没有区别。

当然,如果调用的程序mcrypt_create_iv()具有提升的权限(例如一个setuid程序),它可能能够做其他程序可能做不到的事情。

于 2012-12-14T01:08:49.250 回答
0

我认为open_basedir限制不会影响 PHP 模块中的 C 代码,只会影响 PHP 脚本本身。如果使用 PHP 脚本chroot(),或者 PHP 在 chroot 监狱中作为 Apache 模块运行,则会影响脚本和模块。监狱必须有/dev/urandom

虽然权限可能/dev/urandom会受到限制,但似乎极不可能(为什么有人会这样做?)。

于 2012-12-14T02:25:55.057 回答