【PHP】array_push などの配列の末尾に要素を追加する方法で要素を追加できなくなる場合

  • 2022年6月14日
  • PHP

 PHP の配列は連想配列しかなく、そのキーの採番方法も他言語ではあまり見られない印象を受けます。近いのは MySQL のオートインクリメントあたりです。具体的には既存の int 型のキーの最大値より 1 大きい値をキーとします。
PHP: 配列 – Manual#複雑な型のキャストと上書きの例
 例を出すと次です。

<?php

$a = [
  2 => 'ABC',
];
$a[] = 'DEF';
array_push($a, 'GHI');
var_dump($a);
/*
array(3) {
  [2]=>
  string(3) "ABC"
  [3]=>
  string(3) "DEF"
  [4]=>
  string(3) "GHI"
}*/

Online PHP editor | output for VaWsr

 最初の時点で 2 があるので続いて 3, 4 が追加されました。これを利用して配列の大きさや計算資源にも余裕があるのに配列を増やせなくすることができます。これは次でできます。

<?php
// PHPで扱えるINTの最大値をあらかじめキーとしておきます
$a = [PHP_INT_MAX => 'ABC'];

$a[] = 1;
// Fatal error: Uncaught Error: Cannot add element to the array as the next element is already occupied 
// 追加できずに停止します

Online PHP editor | output for 4899u

 意図してこれを埋め込むことはまずないでしょうが、実は不具合や脆弱性につながるパターンがあります。それはユーザー入力を配列のキーにした後に配列の末尾にキーを指定せずに要素を追加する処理がある場合です。特にこの場合が複数のユーザー間で影響する場合、悪意あるユーザーが巨大な値をこの処理に渡すことによって、システムを利用したいユーザーが利用できない状況を作れてしまいます。

>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG