Web aym.pekori.to

第 62章その他の質問

ここでは他のカテゴリに分類することができないような質問を扱います。

1. bz2 で圧縮された Windows マニュアルはどのように扱えばいいのですか?
2. asort() の定義のように、引数の横に & が ついているのはどういう意味ですか?
3. 私はどのように register_globals を扱うべきですか?

1. bz2 で圧縮された Windows マニュアルはどのように扱えばいいのですか?

bz2 ファイルを処理することができるアーカイバを持っていない場合、 RedHat からコマンドラインツールを ダウンロードしてください (詳細は下記の情報を参照)。

コマンドラインツールを使いたくない場合は、Stuffit ExpanderUltimateZip7-ZipQuick Zip のようなフリーのツールを使用することも可能です。 WinRAR または Power Archiver のようなツールを持っている場合、簡単に bz2 ファイルを解凍できます。 Total Commander(以前は Windows Commander)を使用している場合は、 bz2 用のプラグインを Total Commander のサイトから無料で手に入れることが出来ます。

Redhat から入手可能な bzip2 コマンドラインツール:

Windows 2000 SP2 のユーザは バージョン 1.0.2 を、他の全ての Windows ユーザはバージョン 1.00 を使用してください。 ダウンロードしたら実行ファイルの名前を bzip2.exe へ変更してください。 そしてそれをパスの通ったディレクトリ、例えば C:\Windows(ドライブ名は貴方のシステムにあわせて適宜変更してください) へコピーしてください。

注意: lang は使用する言語を意味し、 pdf のように x は指定した形式を表します。 php_manual_lang.x.bz2 を解凍するには以下のようにします。

  • コマンドプロンプトウィンドウを開きます

  • ダウンロードした php_manual_lang.x.bz2 を保存したディレクトリに cd コマンドを使用して移動します。

  • bzip2 -d php_manual_lang.x.bz2 を実行すると php_manual_lang.x というファイルが同じディレクトリに生成されます。

分割 HTML 版アーカイブ(php_manual_lang.tar.bz2) をダウンロードした場合でも手順は同じです。 唯一の違いは、bzip2 コマンドの実行後に php_manual_lang.tar が生成されることです。 tar 形式のファイルは WinZip といったアーカイバで扱うことができます。

2. asort() の定義のように、引数の横に & が ついているのはどういう意味ですか?

その引数が 参照渡し であり、 ドキュメントに書かれているとおり、関数内でそれが変更される可能性が あることを示します。変数のみをこの方法で渡すことができ、関数を コールする際に & を渡す必要はありません(これは 廃止予定 の方法です)。

3. 私はどのように register_globals を扱うべきですか?

register_globals とセキュリティの関連については、 Using register_globals を参照ください。

register_globals が On であることに依存するよりも、 スーパーグローバル の使用を推奨します。

register_globals が Off になっている共有ホスト上で 古いアプリケーションを動かす必要があり、アプリケーションがこの設定を On にすることを要求している場合、 あるいはこの機能が On になっているホスティングサーバ上でセキュリティの リスクを抑えたい場合など、PHP でこれらの設定を逆転させる必要が出てきます。 いちばんいい方法は PHP の設定を変更できないか確認してみることですが、 もしそれができない場合には、このような方法を使用することができます。

例 62-1. Register Globals をエミュレートする

これは register_globals On をエミュレートします。 variables_order ディレクティブを変更している場合は、それに応じて $superglobals を変更してください。

<?php
// register_globals on をエミュレートする
if (!ini_get('register_globals')) {
    
$superglobals = array($_SERVER, $_ENV,
        
$_FILES, $_COOKIE, $_POST, $_GET);
    if (isset(
$_SESSION)) {
        
array_unshift($superglobals, $_SESSION);
    }
    foreach (
$superglobals as $superglobal) {
        
extract($superglobal, EXTR_SKIP);
    }
}
?>

これは register_globals Off をエミュレートします。 注意してほしいのは、このコードはスクリプト内のいちばん最初に コールされる必要があるということです。ただし、 セッションを開始するために session_start() を使用する場合は、その後にコールする必要があります。

<?php
// register_globals off をエミュレートする
function unregister_GLOBALS()
{
    if (!
ini_get('register_globals')) {
        return;
    }

    
// よりよいエラーメッセージのために、これを変更するとよいでしょう
    
if (isset($_REQUEST['GLOBALS']) || isset($_FILES['GLOBALS'])) {
        die(
'GLOBALS overwrite attempt detected');
    }

    
// unset すべきでない変数群
    
$noUnset = array('GLOBALS',  '_GET',
                     
'_POST',    '_COOKIE',
                     
'_REQUEST', '_SERVER',
                     
'_ENV',     '_FILES');

    
$input = array_merge($_GET,    $_POST,
                         
$_COOKIE, $_SERVER,
                         
$_ENV,    $_FILES,
                         isset(
$_SESSION) && is_array($_SESSION) ? $_SESSION : array());
    
    foreach (
$input as $k => $v) {
        if (!
in_array($k, $noUnset) && isset($GLOBALS[$k])) {
            unset(
$GLOBALS[$k]);
        }
    }
}

unregister_GLOBALS();

?>