PHP从网页传递变量的改变

PHP 自从 4.1.0 开始,支持一种比较安全的变量传递方式。原本我们在写 PHP 程序时,从窗体以 POST 方式传入 PHP 程序时,PHP 可以直接拿来使用。例如,有一个窗体是下面这个样子:

<form action=test.php method=post>
    <input type=text name=username>
    <input type=button value=送出 name=b1>
</form>

当上述的 HTML 按了送出之后,在 test.php 这个程序就会有一个变量名为 $username,其值是我们所填入的名称。

但是使用者也可以直接在网址列输入 http://url/test.php?username=myname 来设定 $username 这个变量的值为 myname。

这会有什么问题呢?让我们以 PHP 4.1.0 release note 所提出的例子来说明。假设我们有一个程序如下:

<?php
if (authenticate_user()) {
    $authenticated = true;
}
...
?> 

使用者可以经由网址列输入一个变量 $authenticated=true,这样一来,不管是否通过 authenticate_user() 的检查,$authenticated 永远都是 true。

所以在 4.1.0 之后,有一个新的方式可以让我们使用,就是将传进来的变量全部都存在数组中。以第一个例子而言,我们以 POST 的方式从窗体传来变量 $username,新的取得变量方式是:$_POST["username"],也就是说所有以 POST 传递过来的变量全部存在 $_POST 这个数组中。详细说明请参考 http://www.php.net/release_4_1_0.php

在 4.2.0 之前,新旧二种方式都可以使用,但是在 4.2.0 之后,Default 只能使用新的方式来传递变量。所以如果你安装的了新 PHP 而发现无法使用旧的 PHP 程序,别惊讶。

如果您还是要以旧的方式来传递变量,请修改 php.ini (通常位于 /usr/local/lib/),将原本的 register_globals = Off 改成下列这个样子,并移除开头的批注符号 ";":

; register_globals = Off
register_globals = On


新的方式下,用来存放变量的数组有下列七种: