3

フォームバリデーター用の他の誰かのコードで動作するコードに出くわしました。投稿されたフォームデータから値を返すはずでした。とにかく、それは常に戻ってきNULLました。これは関数全体です (このコードある時点で機能したと仮定しています)。

function _getValue($field)
{
    global ${$field};
    return ${$field};
}

他の関数のコンテキストから、(この場合は) $_POST 変数から値を取得しようとしていることがわかりました。関数を次のように変更すると、すべてが魅力的に機能しました。

function _getValue($field)
{
    // $_REQUEST should hold $_GET and $_POST values
    return $_REQUEST[$field];
}

だから私の質問は...global ${$field}この文脈で一体何を意味するのですか? 私はそれが何であるかを知っていますが、彼らがその関数${$field}に渡されたとしましょう。emailこのグローバル$email変数はどこから来たのですか?

元の機能はどのように機能したと思われますか? 「スーパーグローバル」か何かと呼ばれるものがあることは知っていますが、それは悪いことです。これは関連していますか?それが機能しなくなった理由でしょうか?ホストはスーパーグローバルをオフにしましたか?

[編集]質問の言い方に明らかに混乱がありました。${$field} と $$field の意味は知っていますが、方法がわかりません

global ${$field};
return ${$field};

ユーザーが次のようなフォームに入れた値を返します

<input name="email">

あなたが電話するとき

$this->_getValue('email');
4

3 に答える 3

2

register_globalsディレクティブのために、POST 変数がグローバル空間にあると予想する前のプログラマー。ありがたいことに、この機能は PHP 4.2 でデフォルトでオフになり、PHP 5.4 で削除されました。

ドキュメントを引用するには:

オンの場合、register_globals は、HTML フォームからのリクエスト変数など、あらゆる種類の変数をスクリプトに挿入します。

どうしてそれが良いアイデアだと思う人がいるのだろうか :)

于 2012-08-07T01:07:48.730 に答える
0

はい、これは register_globals に関連しており、非常に悪いです。非常に古いコードからそれを取得したと思います。現在、デフォルトで Php には register_globals が off に設定されています。そのため、コードが機能していませんでした。あなたの修正は正しいです。Register_globals は、深刻なセキュリティ リスクの問題を引き起こすため、不適切です。

于 2012-08-07T01:09:12.347 に答える
0

明らかに、質問の言い回しが下手で、軌道に乗れませんでした。申し訳ありませんが、Radu と pst からの Radu の投稿に関するコメントから、私の質問に完全に回答する以下を見つけました ( http://php.net/manual/にあるように)。 en/security.globals.php ):

注: register_globals の処理

非推奨のregister_globalsディレクティブがonに設定されている場合、その中の変数もスクリプトのグローバル スコープで使用できるようになります。たとえば、$_POST['foo']としても存在し$fooます。

于 2012-08-07T01:09:31.650 に答える