$ _ post和关联阵列中的变量变量
-
01-10-2019 - |
题
我可能有点厚,但我似乎找不到答案。我正在从带有寄存器的服务器上移动到一个服务器,将其关闭。这是一件好事,但不幸的是,我已经习惯了与Globals一起工作的数年,这导致我编写草率的代码。我现在正在尝试解决这个问题。
我正在尝试重写一些在$ _ 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>
如何与Globals Off Registers一起工作?以下显然不起作用:
<?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
, ,减少过多的打字。)
其他提示
我有一些类似于您的形式的交互作用,但我可以理解您为什么在表单中使用$ _的互动。您应该拥有的是:
<?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”,这将使他们成为您环境变量的转储。实际上,注册全球群体是一个坏主意。
这是 @鲍勃斯的回答中提到的。
而且,关于您的问题,这就是为什么您的示例不适用于PHP的Globals关闭的原因。 PHP与Register Global的Off AFAIK更加严格(有充分的理由),很难执行可变变量技巧。