php / php/php-src

Duplicated properties in serialisation payload

オープン
#22,599 コメント 0 件 リアクション 1 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

Category: Engine Feature Status: Requires RFC
主要言語
C
スター
40.4k
フォーク
8.2k
平均マージ
2日 13時間
マージ済み PR(30日)
96

説明

Description

Opening this as a reminder for the below.

@TimWolla: https://github.com/php/php-src/pull/22588#discussion_r3523424963

It is legal for properties to appear twice in serialization payload?! This probably should be deprecated and killed.

class TestDefault {
    public readonly int $prop = 1;
}

var_dump($s = serialize(new TestDefault));
var_dump(unserialize($s));

// Unserialization still bypasses normal readonly assignment semantics.
var_dump(unserialize("O:11:\"TestDefault\":0:{}"));
var_dump(unserialize("O:11:\"TestDefault\":1:{s:4:\"prop\";i:2;}"));
var_dump(unserialize("O:11:\"TestDefault\":2:{s:4:\"prop\";i:2;s:4:\"prop\";i:3;}"));

string(38) "O:11:"TestDefault":1:{s:4:"prop";i:1;}"
object(TestDefault)#1 (1) {
  ["prop"]=>
  int(1)
}
object(TestDefault)#1 (1) {
  ["prop"]=>
  int(1)
}
object(TestDefault)#1 (1) {
  ["prop"]=>
  int(2)
}
object(TestDefault)#1 (1) {
  ["prop"]=>
  int(3)
}
PHP Version
N/A
Operating System

No response

コントリビューションガイド

コントリビューションガイドを開く

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

調査の方向性

まず、issue にある serialize() と unserialize() の例を再現し、readonly フィールド上の単一のプロパティと重複したプロパティを比較します。プロパティの復元を担うシリアライズおよびアンシリアライズのエントリーポイントを追跡します。重複したプロパティの意図された動作について、deprecated とするか削除するかも含めて合意され、その動作がリグレッションテストでカバーされれば完了です。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
php
領域
backend
issue の種類
バグ
難易度
5/5
見積もり時間
1週間以上
活発さ
静か
明瞭さ
おおむね明確
初心者へのやさしさ
38/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。