$ _POSTおよび連想配列内の変数変数
-
01-10-2019 - |
質問
私はおそらく少し厚いですが、これに対する答えを見つけることができないようです。私は、レジスタグローバルを備えたサーバーからオフになっているサーバーから1つに移動しています。それは良いことですが、残念なことに、私は何年もの間、登録グローバルズの存在と慣れてきました。私は今それを修正しようとしています。
$ _POST内に変数変数を持ついくつかの古いコードを書き直そうとしています。
私はこれがばかげた例であることを知っていますが、それは私が解決しようとしている問題を示しています。以下は、登録グローバルで動作します。
<?php $variable = "fullname";?>
<form action="/test/" method="post">
<label for="fullname">Full Name:</label> <input name="fullname" type="text" value="<?php echo $$variable;?>" size="20" maxlength="150" />
<input name="submit" type="submit" value="Go!" />
</form>
登録グローバルをオフにしてこれを機能させるにはどうすればよいですか?以下は明らかに機能しません。
<?php $variable = "fullname";?>
<form action="/test/" method="post">
<label for="fullname">Full Name:</label> <input name="fullname" type="text" value="<?php echo $_POST[$$variable];?>" size="20" maxlength="150" />
<input name="submit" type="submit" value="Go!" />
</form>
私を簡単にしてください - 私はおそらく愚かであることを知っていますが、私はこれをこれに回すことができないようです。
解決
シンプル、ちょうど $_POST[$variable]
. 。 (または $_GET
または多分 $_REQUEST
, 、 適切に。)
ただし、テキストをHTMLに出力する場合、それをエンコードする必要があるか、クロスサイトスリップティング攻撃に対して脆弱になることに注意してください。
<input type="text"
name="<?php echo htmlspecialchars($variable);?>"
value="<?php echo htmlspecialchars($_POST[$variable]);?>"
size="20" maxlength="150"
/>
(通常、呼ばれる関数を定義します h
そうです echo htmlspecialchars
, 、この過剰な量のタイピングを削減します。)
他のヒント
私はあなたのものに似た形の相互作用を持っていますが、私はあなたがフォーム内で$ _POSTを使用している理由を理解することができます。あなたが持っているべきはこれです:
<?php $variable = $_POST["fullname"];?>
<form action="/test/" method="post">
<label for="fullname">Full Name:</label> <input name="fullname" type="text" value="<?php echo $variable; ?>" size="20" maxlength="150" />
<input name="submit" type="submit" value="Go!" />
</form>
$ _POSTは配列です。
$_POST[$variable]
全体を取り除くことができます $$
狂気と単にそうします $_POST[$variable]
.
あなたは確かにあなたが意味しました $_POST[$$variable]
とは対照的に $_POST[$variable]
$ _Super Globalsから直接変数変数を使用することは、特にコードのいずれかがオープンソースである場合、悪い考えであり、セキュリティリスクです。入力を変更して突くように変更し、許可した変数の値を見つけることができます。たとえば、環境変数のダンプを取得する「$ _ENV」を渡すことができます。実際、Globalsの登録はとにかく悪い考えです。
これは @ボビンスの回答で言及されています。
そして、あなたの質問に関して、それがあなたの例がPHPのレジスタグローバルで動作しない理由です。 PHPは、Global's Off、AFAIKでより厳格です(正当な理由で)、変数変数のトリックを実行することは困難です。