見PHPスクリプトを必要とするregister_globals
-
28-10-2019 - |
質問
私が継承されたwebサーバーに満ちたコードを必要とする register_globals
きます。そのほとんどはカスタムコードが書いたランダムに人々が過ぎ去ります。私は固定のしるスクリプトの知って、私の問題ではない。
していきたいと考えて書面での申込にスキャンを通して各ディレクトリはwebサーバの特定のPHPスクリプトを必要とする register_globals
.あの戦略は?
方法のひとつにしていると考えられている何らかの強制力をPHPに報告すべての誤差、実行スクリプトは、チェックのための未定義の変数を通知。私が造るアプリケーションを読み込み STDERR
ストリームです。
ありの方法にとらわれず自由に考えるか?
他のヒント
単一のファイルが常に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");
}
}