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可以在哪里的情况?
答案 0 :(得分:1)
权限未分配给函数,它们根据其用户,组或世界成员身份分配给流程(如果您使用ACL,则可以使用更精细的控制权)。
因此,如果您的进程以特定身份运行,则尝试使用fopen()
或mcrypt_create_iv()
(使用{{}打开文件之间没有区别1}}在较低级别。)
当然,如果调用open()
的程序具有提升的权限(例如mcrypt_create_iv()
程序),则可能能够执行其他程序可能不会执行的操作。
答案 1 :(得分:0)
我认为open_basedir
限制不会影响PHP模块中的C代码,只影响PHP脚本本身。如果PHP脚本使用chroot()
,或者PHP在chroot jail中作为Apache模块运行,那么会影响脚本和模块,就像这样;监狱必须有/dev/urandom
。
虽然/dev/urandom
上的权限可能受到限制,但似乎极不可能(为什么有人会这样做?)。