PHP8于2020年11月26日发布。在安全方面,它带来了很多有趣的事情,但同时也展示了近视中的一些(次要)错失的机会。
我非常喜欢依靠键入来确保安全性,例如javascript中的“受信任的类型”:如果不安全,则不能编译。
由于Saner字符串将数字与RFC进行比较,PHP8不再尝试将字符串转换为数字了,这意味着与以0e开头的哈希值之类的冲突终于成为了过去!这是Snuffleupagus的子集。 comparison草的比较预防功能。
内部函数RFC的一致类型错误将防止类似0 == strcmp($ _ GET [' username'],$ password)之类的事情,因为strcmp不会返回null并不再发出警告,但会抛出适当的异常。这也是PHP为函数参数和返回类型添加注释的绝佳机会。
PHP8带有一个基于DynASM的JIT,它将RWX内存空间带入PHP的内存空间,并进行共享分配,这意味着其偏移量不会在不同的PHP8 +进程之间交换。
而且,DynASM的设计不考虑处理/编译/执行不受信任的代码,并且不做诸如常量盲化和高级折叠以防止喷涂的行为,也不做随机填充/否定插入,也不确保内存区域禁止同时编写和执行以防止直接代码注入。这就是说,利用内存损坏时,现在更容易获得本机代码执行,尽管这是公平的,但大多数攻击者对php代码执行感到满意,并且不会继续前进。
拥有JIT会带来很多代码复杂性和维护负担。毫无疑问,我将是大量错误的源头,以改善实际工作负载的速度。
现在,当提供未知的salt格式时,crypt将失败,而不是默默地退回到DES。该参数也成为必需参数,现在不支持不加盐的哈希。
错误控制运算符(也称为@)不再使致命错误消失,这意味着编写不当的Web Shell将有更多机会在日志中留下痕迹。
libxml_disable_entity_loader现在已被弃用,即使php文档中尚未反映出它。这是可以接受的,因为PHP8现在至少需要libxml 2.9.0,并且默认情况下禁用了外部实体加载。
访问未定义的常量将引发错误,而不是被默默地解释为字符串,而不再将SALT默默地转换为" SALT"。
与phar相关的元数据将不再被序列化,从而杀死低挂的RCE向量。
FILTER_SANITIZE_MAGIC_QUOTES,get_magic_quotes_gpc和get_magic_quotes_runtime已被删除,人们现在必须进行适当的消毒。
与cinstant相对的未定义变量仍然不是错误,这意味着诸如soltinstead盐之类的东西可能(并且将会)被忽略。
将Array转换为字符串只会产生警告而不是错误,尽管现在__toString可以最终抛出,但它有望在不久的将来发生变化。 尽管PHP7中CSPRNG进行了重大改进,但PHP8并未抓住机会保持势头,并且像Snuffleupagus一样将rand和mt_rand归为random_int。 我认为另一个错失的机会是,除了通过stream_wrapper_unregister之外,仍然没有办法禁用某些PHP的包装器,但是可以通过stream_wrapper_restore来取消它。 //一个通过php://filter/convert.base64-encode/resource=/some/file提取数据,是隐藏在阴影中的大量神秘事物。提供一种减少这种攻击面的方法(例如使流选择 -in)。