関数(クラスメソッドではない)内で、extract( $_REQUEST, EXTR_IF_EXISTS )
事前に変数を定義していれば、安全に使用できますか?
例:
$a = $b = $c = '';
extract( $_REQUEST, EXTR_IF_EXISTS );
または、これにより、PHPグローバルおよびその他の機密性の高いものが悪意のある攻撃者によって上書きされる可能性がありますか?
あなたはそれをすることができます、しかしあなたはそれをすることを同じように簡単に避けることができます:
$a = isset($_REQUEST['a']) ? $_REQUEST['a'] : '';
$b = isset($_REQUEST['b']) ? $_REQUEST['b'] : '';
$c = isset($_REQUEST['c']) ? $_REQUEST['c'] : '';
次に、現在のスコープに他に何も忍び込んでいないことを確認できます。
コードをより美しくしたいだけの場合は、グローバルヘルパー関数を使用することを検討してください。
function request($k, $def=''){
return isset($_REQUEST[$k]) ? $_REQUEST[$k] : $def;
}
そして、設定されていない引数のデフォルト値を使用して、必要に応じて初期化できます。
$a = request('a');
$b = request('b', null);
$c = request('c', "hello");
本当に使用したい場合はextract
、これを試してください:
function requested($a){
return array_intersect_key($_REQUEST, array_flip($a));
}
extract( requested(array('a', 'b', 'c')), EXTR_IF_EXISTS );
これは、$_REQUEST
最初に必要なキーのみを含むように変更してから、extractを実行することで機能します。
まあそれは安全ではありません。誰かがこのようなことをする可能性があります。www.example.com?_SERVER['anything']
または、彼が何らかの知識を持っている場合は、別の変数に何かを注入しようとする可能性があります。それはまだある種の推測ゲームですが、それは可能です。
また、1つの入力の名前に1つのタイプミスがあると、抽出が間違った場所にあり、重要なものが置き換えられたときに、プログラム全体が混乱する可能性があります。そのようなエラーはデバッグが非常に困難です。
extract()
どの変数がすでに定義されているかを実際に知るには、実際にはローカル名前空間にいる必要があるため、使用にはあまりにも疑わしい点があると思います。
私はこれらの線に沿って何かをするつもりです、それはそれほどきれいではありませんが、それでもどの変数がからの入力として受け入れられているかを見るのはかなり簡単です$_REQUEST
:
foreach ( array(
'a',
'b',
'c',
'foo' )
as $auth_var){
if ( isset( $_REQUEST[$auth_var] ) ) ${$auth_var} = $_REQUEST[$auth_var];
}
私は自分よりもCalの解決策を掘り下げています。見た目も良くなります:
extract ( array_intersect_key( $_REQUEST, array_flip( array(
'a',
'b',
'c',
'foo' )
) ) );
そのコードは期待どおりに機能しますが、間違った場所に配置すると、もちろんうまくいかない可能性があります。
include ('/some/file/with/super/secret/config/in.php');
$a = $b = $c = '';
extract( $_REQUEST, EXTR_IF_EXISTS );
しかし、あなたがそれをどこで行っているか、そしてあなたがどの範囲にいるのかを知っている限り、それは問題ありません。
個人的にはおそらくこれを書かないでしょうが、それはあなたが何をしようとしているのかによります。
サーバーで実行している場合は、これによって$_SERVERが上書きされる可能性があることに注意してください。実際、些細なCLIアプリがなければ、これを使用しないでください。怖すぎます。