RCTF2019 nextphp

nextphp 主要考察的是php7.4的几个新特性

preload.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<?php
final class A implements Serializable {
protected $data = [
'ret' => null,
'func' => 'print_r',
'arg' => '1'
];

private function run () {
$this->data['ret'] = $this->data['func']($this->data['arg']);
}

public function __serialize(): array {
return $this->data;
}

public function __unserialize(array $data) {
array_merge($this->data, $data);
$this->run();
}

public function serialize (): string {
return serialize($this->data);
}

public function unserialize($payload) {
$this->data = unserialize($payload);
$this->run();
}

public function __get ($key) {
return $this->data[$key];
}

public function __set ($key, $value) {
throw new \Exception('No implemented');
}

public function __construct () {
throw new \Exception('No implemented');
}
}

预加载

https://wiki.php.net/rfc/preload

什么是预加载?预加载允许服务器在启动时在内存中加载PHP文件,并使它们对所有后续请求永久可用,使用function_exists()或class_exists()检查时将返回TRUE。使用opcache.preload这个指令,我们将指定一个PHP文件 - 它将执行预加载任务。加载后,该文件将完全执行 - 并可以通过包含它们或使用opcache_compile_file()函数预加载其他文件。

外部函数接口FFI

https://wiki.php.net/rfc/ffi

这个特性就是说允许你在php中调用C代码。当然,在默认配置下,我们只能在预加载的php文件中使用FFI,但是PHP FFI API限制仅对FFI类有效,对FFI\CData对象的重载函数无效。也就是说,我们可以在预加载文件中生成一些FFI\CData对象,然后再通过我们的代码来调用

自定义对象序列化

https://wiki.php.net/rfc/custom_object_serialization

在 PHP 7.4 中,增加了 __serialize__unserialize 这两个魔术方法,你可以用来自定义对象的序列化,而Serializable在之前就有了,在同时拥有两种序列化接口的时候,PHP7.4 会优先使用新版本的接口。