質問
これがコミュニティウィキとしてマークされるのが良いかどうかはわかりませんが、とにかく:
Register_globalsを殺す簡単な方法はありますか?私はPHPフレームワークに取り組んでいますが、今はスクリプトを設定して、Register_Globalsがオンになっている場合に終了します。私は人々にそれを無効にすることを強制することを好みますが、そこに それは まだそれを持っているサーバー。
PHP 5.3.0 Register_Globalsが非推奨であり、PHP 6では完全に削除されることを知っていますが、まだここにいる間、それに対処するのは常に良いことです。
私はいくつかの方法を見ました、そして私は現在これを使用することを考えています:
$temp = array_merge($_GET, $_POST, $_COOKIE); foreach($temp as $k => $v) { if(isset($$k)) unset($$k); }
ただし、ここにはいくつかの問題があります。特に多くの入力データがある場合、これはリソースのインセンティブです。たとえば、ランタイムで無効にすることが機能するかどうかはわかりません。
ini_set('register_globals', 'Off')
Register_globalsを取り除くために聞いたことがないより良い方法はありますか?ありがとう。
解決
Register_globalsを扱う方法があります PHPマニュアルで説明されています. 。 register_globals
ini設定 実行時に設定することはできません に ini_set()
, 、したがって、.htaccessまたはwebサーバー構成ファイルでそれを行うことができない場合、公式の回避策があると提供される方法。
基本的に、このコードのスニペットを提供して、互換性をエミュレートします。
<?php
// Emulate register_globals off
function unregister_GLOBALS()
{
if (!ini_get('register_globals')) {
return;
}
// Might want to change this perhaps to a nicer error
if (isset($_REQUEST['GLOBALS']) || isset($_FILES['GLOBALS'])) {
die('GLOBALS overwrite attempt detected');
}
// Variables that shouldn't be 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();
?>
他のヒント
追加できます php_flag register_globals off
.htaccessファイルに、すべてのサーバーがこれを受け入れるわけではありません。したがって、フレームワークを公開する予定がある場合は、それは良い考えではないかもしれません。