今週の PHP 2022/09/10 〜 2022/09/16

2022/09/17に公開

PHP のメーリングリストから、気になった情報をピックアップします。

Internal

PHP: rfc:improve_unserialize_error_handling

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

今週も議論が続いています。
E_ERROR, E_NOTICE として扱われている既存の振る舞いについての説明や、実際にこのRFCが採択されたあとのユーザー側のコード修正についてなどです。
unserialize にオプション引数を与えて、ユーザーが選択できるようにする。いや、それよりもきちんとしたデフォルト挙動を定義すべきだ...などなど

着地するまで、もう少し議論がありそう。

Increase maximum size of an uploaded file to 50Mbyte - Externals

https://externals.io/message/118570

今週は、大垣さんから反対のお便り

post_max_size
upload_max_size

この2つのサイズを不用意に大きくすると、DoS 攻撃を許すことになるとのこと。
これだけでは、わからないなと思ってたのですが、追加で以下のリンクが参考としてはられていました。

Long password denial of service - Vulnerabilities - Acunetix https://www.acunetix.com/vulnerabilities/web/long-password-denial-of-service/

上げる必要があるサービスだけが、意図的に閾値を上げるのが、セキュリティ的な観点では正しいんだろうなと思います。
いわゆるフェイルセーフ。

同様の意見が出てきており、ただ単純に上げればいいという話ではなくなってきています。

Issues with readonly classes - Externals

https://externals.io/message/118554

Readonly に追加して、Immutable という概念も必要なのではという話もでてきており、もはやよくわからない......

Readonly クラスは、Immutable なデータの箱として利用するのが一番で、Immutable なデータ同士の継承以外は禁止っていうのが一番ラクな落とし所な気がする。
実際、trait その他について、現状そうなっているし。

RFC: StreamWrapper Support for glob()

8.3 向けの新しい RFC です。

https://www.php.net/manual/ja/function.glob.php

glob 関数はパターンにマッチするパス名を検索するという関数です。(使ったこと無い...)

RFC は以下です。
glob が通常のファイルパス名だけでなく、ストリームのパスにも対応できるようにするという提案です。

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

glob('vfs://*.ext')

すでに PoC も出ています。

https://gist.github.com/KapitanOczywisty/76fc889c3570da597f30743717b6359a

しかし、ユーザーランドパッケージがすでにあり、大人気で使われているよ?という情報も入ってきていて、今後の展開は不透明です。

https://packagist.org/packages/webmozart/glob

[RFC][Poll] Asymmetric Visibility and Accessor syntax

https://wiki.php.net/rfc/asymmetric-visibility

非対象可視性(適当に翻訳した)について、文法の投票が行われていました。

https://externals.io/message/118557

結果としては、当初の提案通りに Swift リスペクトの文法に落ち着きました

public private(set)

Error behaviour for max_input_vars

ini 設定の max_input_var について

GET や POST で送信される変数の最大値を設定するものです。デフォルトは1000です。ドキュメントには、無制限を示唆するような設定値は書かれてないです。

https://www.php.net/manual/ja/info.configuration.php#ini.max-input-vars

質問者の方は、大量の入力変数を送ってくるサービスを扱っているらしく、1000を超えることもあるので、この設定値を上げているそうです。
しかし、入力変数が設定値を超えてしまうと、静かにtruncate されてしまうようで、未確定の量の入力変数の情報が消失してしまうとのこと。

質問は、このようなデータ消失について、どのように検知したらよいかというものです。

$_POST の変数の数を数える。 error_get_last() で確認する。 set_error_handler() で確認するなど。

質問者さんの要望は、ユーザーランドで確認するのは限界があるので、入力変数を正常に受け取れてない場合は、エラーを吐いて処理を中止するなどのふるまいをPHP本体に足してほしいというものです。

質問者さんの提案は3つ

  1. 新しい ini 設定で、設定値を超えた入力変数がきたらエラーに出来るようにする
  2. 入力変数が truncate されたことを検知する関数の追加
  3. この設定項目は無くしてしまう。Webサーバーが許す限りの入力変数を受け取る

これに対して、さらなる追加提案が出てきたり

  1. デフォルトで、設定値オーバーはエラーにして処理を中止する。

それぞれの方が、いろんな意見を出してきて白熱しています。

この議論の中でも、セキュリティ面での指摘があり
無制限の入力変数は DOS攻撃を促進する可能性があるという意見が出ています。

リリース関連

8.1.11 RC1
8.0.24 RC1

それぞれ、テスト用にリリースされています

Bugs

PHP8.2: (A&B)|D as a param should allow AB or D. Not just A. · Issue #9516 · php/php-src

https://github.com/php/php-src/issues/9516

DNF Type の不具合。すでに修正済み。

修正コミットはこちら

https://github.com/php/php-src/commit/9286101da4732d82345cacd618ce0eab78b7b729

PHP8.2 Disjunctive Normal Form Types - readonly property followed by ( · Issue #9500 · php/php-src

https://github.com/php/php-src/issues/9500

こちらも DNF Type 案件

private readonly (B&C)|A $d; 

readonly キーワードの後ろに括弧付きの DNF 型を指定すると Syntax Error になる

https://github.com/php/php-src/pull/9512/files

DNF といよりは readonly 側の対応不備だったようです。

Disabling IPv6 support interferes with registration of certain unrelated constants · Issue #9518 · php/php-src

https://github.com/php/php-src/issues/9518

IPv6 サポートを切ると、関係ない定数も無くなってしまうというイシュー

プリプロセスの if 文の閉じる箇所がおかしかったようです。

https://github.com/cmb69/php-src/commit/fa3b5f7a92e85bb7d7139de902b1356521abf03d

最近対応された他のイシューで混入しました。

https://github.com/php/php-src/pull/9426

mb_convert_encoding "" (backslash) and "~" (tilde) BC breaks to Shift_JIS-2004

https://github.com/php/php-src/issues/9528

バックスラッシュとチルダの、Shift_JIS-2004 変換の BCブレーク案件

日本人PHPer アベンジャーズが https://github.com/php/php-src/issues/8281 で指摘しまくって修正された案件の細かい水平展開。
すでに修正された前例があるので、スムーズに修正までいくと良さそう。

PDOException::getCode() return value type is string · Issue #9529 · php/php-src

https://github.com/php/php-src/issues/9529

getCode が int ではなく string を返却するパターンがあるので、エラーメッセージが Type Errorになってしまって、困るという案件

PDOException クラスの仕様を見ると $code は int または string となっているので、getCode は戻り地のパターンを広げて上げる必要がありそう。しかし、戻り値の型が広がるのは共変性の違反では?かつ、final で宣言された継承メソッドなんだが、この辺の整理はどうつけるのだろうか?

https://www.php.net/manual/en/class.pdoexception.php

The behavior of mb_strcut in mbstring has been changed in PHP8.1 · Issue #9535 · php/php-src

https://github.com/php/php-src/issues/9535

mb_strcut の挙動が 8.1 で変わってしまっているというイシュー

https://3v4l.org/FaVWR

ISO-2022-JP の例ですが、メール送信などで利用しているパターンがありそうなので、影響が大きそう

幸い、不具合として扱われそうなので、Fixはされそう。

Timelib 2021.17 integration, with bug fixes by derickr · Pull Request #9538 · php/php-src

https://github.com/php/php-src/pull/9538

累積的な timelib の不具合修正マージ

Strange behavior of the comparison operator · Issue #9542 · php/php-src

https://github.com/php/php-src/issues/9542

久々の IEEE 754 案件

https://ja.wikipedia.org/wiki/IEEE_754

https://3v4l.org/qUe95

parse_url() regression in php 8.2, no longer recognizes 'scheme:#fragement · Issue #9545 · php/php-src

https://github.com/php/php-src/issues/9545

以前修正されていたはずのイシューのレグレッション

https://github.com/php/php-src/pull/7844

https://3v4l.org/nFqLN

RFC が正しいのか、PHP の実装を直すのか?というあたりで議論になっています。

Discussion