質問

私が継承されたwebサーバーに満ちたコードを必要とする register_globals きます。そのほとんどはカスタムコードが書いたランダムに人々が過ぎ去ります。私は固定のしるスクリプトの知って、私の問題ではない。

していきたいと考えて書面での申込にスキャンを通して各ディレクトリはwebサーバの特定のPHPスクリプトを必要とする register_globals.あの戦略は?

方法のひとつにしていると考えられている何らかの強制力をPHPに報告すべての誤差、実行スクリプトは、チェックのための未定義の変数を通知。私が造るアプリケーションを読み込み STDERR ストリームです。

ありの方法にとらわれず自由に考えるか?

役に立ちましたか?

解決

ほとんどのIDEは未定義の変数を表示します、 phpstorm たとえば、すべてのソースファイルをスキャンさせることができ、すべてのコードの未定義の変数について通知され、ホワイトアウトは実際に実行します。

これはおそらく最も単純で痛みのないバリアントです。または、明らかにあなた自身のスクリプトを使用して自分のスクリプトを書くことができます トークンザー すべてを特定します T_VARIABLEs T_VARIABLE '=' expr 構成。しかし、これはよりエラーが発生しやすくなります。 IDEを使用すると、おそらくより少ない労力でより良い結果が得られます。

他のヒント

単一のファイルが常にregister_globalsがオンまたはオフになっていると仮定すると、スクリプトに送信されるすべてのフォーム要素名のリストを作成し、使用している場合はこのスクリプトを確認できます $fieldname 含まれていない $_REQUEST['fieldname'] (または $_POST, $_GET 配列)。

それらのチェックを行う際に非常に高いコードカバレッジを保証できれば、「通知のためのチェック」方法は問題ありません(何も見逃さないように - 覆われていないパーツを手動でチェックする必要があります)。

グローバルなVARを期待して書かれたスクリプトの症状のログを調べることは役立つ可能性がありますが、コードを読むことは実際にこれを行う唯一の方法です。これを自動化したい場合は、PHPインタープリターを構築または依存する必要があります。そうしないと、条件、潜在的な回避などの内側にネストされたものを見逃す運命にあります。

の使用を見つける方法があります グローバルを登録します それは実行されるコードの文字列です。次のスクリプトを作成し、PHPを使用できます auto_prenpt_file INIオプション既存のコードにそれを準備します。

<?php

class revealGlobalsUsage {

    public $globalName;
    public $globalVal;

    public function __construct($name, $val)
    {
        $this->globalName = $name;
        $this->globalVal = $val;
    }

    public function __toString()
    {
        $backtrace = debug_backtrace();

        // log backtrace here...

        return $this->globalVal;
    }
}

// overwrite globals that have been set from GET and POST requests
foreach ($_REQUEST as $name => $val) {
    // Strings that are cast to integers will fail as there 
    // is no __toString equivalent for integers/bool/float etc.
    if (is_string($val) && !is_numeric($val)) {
        $GLOBALS[$name] = new revealGlobalsUsage($name, $val);
    }

    // You can log all GET/POST requests here...
}

整数などの場合は、PHPにパッチを当てる必要があります。 https://gist.github.com/ircmaxell/1966809

またこの問題を自分自身の巨大なコードベースのファイルです。の溶液に掲載@sschuellerい試こauto_prepend_fileコードするログの発生のための調査である。このメソッドを使用することも併せて解析/tokenizingキャッチの発生.

<?php

$vars = get_defined_vars();

foreach ($vars as $var => $value) {
    if (in_array($var, array('$_SERVER', '$_REQUEST', '$_GET', '$_POST', '$_COOKIE', '$_SESSION', '$_FILES', '$_ENV'))) {
        // only examine the local symbols, not superglobals
        continue;
    }

    if (array_key_exists($var, $_REQUEST) && $value == $_REQUEST[$var]) {
        error_log(sprintf("register_globals reliance detected in %s for variable %s=%s", $_SERVER['SCRIPT_FILENAME'], $var, $value), 3, "/var/tmp/register_globals.log");
    }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top