今週の PHP 2022/09/10 〜 2022/09/16
PHP のメーリングリストから、気になった情報をピックアップします。
Internal
PHP: rfc:improve_unserialize_error_handling
今週も議論が続いています。
E_ERROR, E_NOTICE として扱われている既存の振る舞いについての説明や、実際にこのRFCが採択されたあとのユーザー側のコード修正についてなどです。
unserialize にオプション引数を与えて、ユーザーが選択できるようにする。いや、それよりもきちんとしたデフォルト挙動を定義すべきだ...などなど
着地するまで、もう少し議論がありそう。
Increase maximum size of an uploaded file to 50Mbyte - Externals
今週は、大垣さんから反対のお便り
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
Readonly に追加して、Immutable という概念も必要なのではという話もでてきており、もはやよくわからない......
Readonly クラスは、Immutable なデータの箱として利用するのが一番で、Immutable なデータ同士の継承以外は禁止っていうのが一番ラクな落とし所な気がする。
実際、trait その他について、現状そうなっているし。
RFC: StreamWrapper Support for glob()
8.3 向けの新しい RFC です。
glob 関数はパターンにマッチするパス名を検索するという関数です。(使ったこと無い...)
RFC は以下です。
glob が通常のファイルパス名だけでなく、ストリームのパスにも対応できるようにするという提案です。
glob('vfs://*.ext')
すでに PoC も出ています。
しかし、ユーザーランドパッケージがすでにあり、大人気で使われているよ?という情報も入ってきていて、今後の展開は不透明です。
[RFC][Poll] Asymmetric Visibility and Accessor syntax
非対象可視性(適当に翻訳した)について、文法の投票が行われていました。
結果としては、当初の提案通りに Swift リスペクトの文法に落ち着きました
public private(set)
Error behaviour for max_input_vars
ini 設定の max_input_var
について
GET や POST で送信される変数の最大値を設定するものです。デフォルトは1000です。ドキュメントには、無制限を示唆するような設定値は書かれてないです。
質問者の方は、大量の入力変数を送ってくるサービスを扱っているらしく、1000を超えることもあるので、この設定値を上げているそうです。
しかし、入力変数が設定値を超えてしまうと、静かにtruncate されてしまうようで、未確定の量の入力変数の情報が消失してしまうとのこと。
質問は、このようなデータ消失について、どのように検知したらよいかというものです。
$_POST
の変数の数を数える。 error_get_last()
で確認する。 set_error_handler()
で確認するなど。
質問者さんの要望は、ユーザーランドで確認するのは限界があるので、入力変数を正常に受け取れてない場合は、エラーを吐いて処理を中止するなどのふるまいをPHP本体に足してほしいというものです。
質問者さんの提案は3つ
- 新しい ini 設定で、設定値を超えた入力変数がきたらエラーに出来るようにする
- 入力変数が truncate されたことを検知する関数の追加
- この設定項目は無くしてしまう。Webサーバーが許す限りの入力変数を受け取る
これに対して、さらなる追加提案が出てきたり
- デフォルトで、設定値オーバーはエラーにして処理を中止する。
それぞれの方が、いろんな意見を出してきて白熱しています。
この議論の中でも、セキュリティ面での指摘があり
無制限の入力変数は 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
DNF Type の不具合。すでに修正済み。
修正コミットはこちら
(
· Issue #9500 · php/php-src
PHP8.2 Disjunctive Normal Form Types - readonly property followed by
こちらも DNF Type 案件
private readonly (B&C)|A $d;
readonly キーワードの後ろに括弧付きの DNF 型を指定すると Syntax Error になる
DNF といよりは readonly 側の対応不備だったようです。
Disabling IPv6 support interferes with registration of certain unrelated constants · Issue #9518 · php/php-src
IPv6 サポートを切ると、関係ない定数も無くなってしまうというイシュー
プリプロセスの if 文の閉じる箇所がおかしかったようです。
最近対応された他のイシューで混入しました。
mb_convert_encoding "" (backslash) and "~" (tilde) BC breaks to Shift_JIS-2004
バックスラッシュとチルダの、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
getCode が int ではなく string を返却するパターンがあるので、エラーメッセージが Type Errorになってしまって、困るという案件
PDOException クラスの仕様を見ると $code
は int または string となっているので、getCode は戻り地のパターンを広げて上げる必要がありそう。しかし、戻り値の型が広がるのは共変性の違反では?かつ、final で宣言された継承メソッドなんだが、この辺の整理はどうつけるのだろうか?
The behavior of mb_strcut in mbstring has been changed in PHP8.1 · Issue #9535 · php/php-src
mb_strcut
の挙動が 8.1 で変わってしまっているというイシュー
ISO-2022-JP
の例ですが、メール送信などで利用しているパターンがありそうなので、影響が大きそう
幸い、不具合として扱われそうなので、Fixはされそう。
Timelib 2021.17 integration, with bug fixes by derickr · Pull Request #9538 · php/php-src
累積的な timelib の不具合修正マージ
Strange behavior of the comparison operator · Issue #9542 · php/php-src
久々の IEEE 754 案件
parse_url() regression in php 8.2, no longer recognizes 'scheme:#fragement · Issue #9545 · php/php-src
以前修正されていたはずのイシューのレグレッション
RFC が正しいのか、PHP の実装を直すのか?というあたりで議論になっています。
Discussion