PHP 5.3.2 での修正点や機能追加について

先日、PHP 5.3.2 が公開されました。セキュリティ問題を含む多くの修正や機能追加が行われています。
PHP 5.2.12 や PHP 5.2.13 で修正され、PHP 5.3.1 に含まれていないセキュリティ問題の修正も含まれていますので、特に PHP 5.3.0 や PHP 5.3.1 を使っている場合は、アップデートした方が良いと思います。

以下に、今回のアップデートで、気になった部分についてメモしておきます。

文字エンコーディング関連の修正

PHP 5.3.2 の ChangeLog などには書かれていないような気がしますが、以前、以下に書いた問題の修正が行われています。

PHP 5.3.0 や PHP 5.3.1 では、これらの修正は行われていませんので、PHP 5.3.2 にアップデートした方が安全な場合があるかもしれません。

ReflectionMethod::setAccessible が実装

以前の日記に、ReflectionMethod::setAccessible があると、プライベートメソッドのテストをする時に簡単という主旨のことを書いたのですが、PHP 5.3.2 で実装されていました。

実行例は以下の通りです。

<?php

class TestClass
{
	private function testMethod( $args )
	{
		echo htmlspecialchars( 'Private Method - Args:(' . implode( ",", $args ). ")\n",
		   	ENT_QUOTES, 'UTF-8' );
   	}
}

$obj    = new TestClass();
$method = new ReflectionMethod( 'TestClass', 'testMethod' );
try {
	// setAccessible( TRUE ) を実行せずにプライベートメソッドを呼び出す
	echo "1: ";
	$method->invoke( $obj, array( 1, 2, 3 ) );
}
catch ( ReflectionException $ex ) {
	echo htmlspecialchars( $ex->getMessage(), ENT_QUOTES, 'UTF-8' ) . "\n";
}

try {
	// setAccessible( TRUE ) を実行してプライベートメソッドを呼び出す
	echo "2: ";
	$method->setAccessible( TRUE );
	$method->invoke( $obj, array( 4, 5, 6 ) );
}
catch ( ReflectionException $ex ) {
	echo htmlspecialchars( $ex->getMessage(), ENT_QUOTES, 'UTF-8' ) . "\n";;
}

try {
	// setAccessible( FALSE ) を実行してプライベートメソッドを呼び出す
	echo "3: ";
	$method->setAccessible( FALSE );
	$method->invoke( $obj, array( 7, 8, 9 ) );
}
catch ( ReflectionException $ex ) {
	echo htmlspecialchars( $ex->getMessage(), ENT_QUOTES, 'UTF-8' ) . "\n";;
}

結果は以下のようになります。

1: Trying to invoke private method TestClass::testMethod() from scope ReflectionMethod
2: Private Method - Args:(4,5,6)
3: Trying to invoke private method TestClass::testMethod() from scope ReflectionMethod

crypt() で SHA-256 と SHA-512 のサポート

crypt() で $5$ や $6$ から始まる salt を指定することで、SHA-256 や SHA-512 が使用できるようになりました。

<?php
echo 'SHA-256' . crypt( 'test', '$5$rounds=5000$salt$' ) . "\n";
echo 'SHA-512' . crypt( 'test', '$6$rounds=5000$salt$' ) . "\n";

結果は以下のようになります。

SHA-256: $5$rounds=5000$salt$lNwM/2EW94.5e484ZZwetUClB7.Z/Z3buPmQvXdPEj4
SHA-512: $6$rounds=5000$salt$xdLuw21n.5WciQUUpHTTPfR6QwS..Z1Q/4xGfiyYa51WSQktzSXYXSk2zBp.Is5r9WiXrGqRmHpEG0iG0HaSk.

その他いくつかの関数追加

標準の関数として、以下が追加されました。今までのバージョンでは取得できなかった情報が取得できるようになっています。特にデバッグの際に役立つかもしれません。

実行例としては以下の通りです。

<?php
chdir( '/tmp' );
var_dump( realpath_cache_get() );
echo "--\n";
var_dump( realpath_cache_size() );
echo "--\n";
var_dump( stream_resolve_include_path( 'PEAR.php' ) );
array(2) {
  ["/tmp/test.php"]=>
  array(4) {
    ["key"]=>
    int(-1263812340)
    ["is_dir"]=>
    bool(false)
    ["realpath"]=>
    string(13) "/tmp/test.php"
    ["expires"]=>
    int(1267965765)
  }
  ["/tmp"]=>
  array(4) {
    ["key"]=>
    int(-2034802845)
    ["is_dir"]=>
    bool(true)
    ["realpath"]=>
    string(4) "/tmp"
    ["expires"]=>
    int(1267965765)
  }
}
--
int(83)
--
string(27) "/usr/local/lib/php/PEAR.php"