ID:               20796
 Updated by:       [EMAIL PROTECTED]
 Reported By:      [EMAIL PROTECTED]
-Status:           Critical
+Status:           Closed
 Bug Type:         Variables related
 Operating System: Red Hat 8.0
 PHP Version:      4.3.0-rc2
 New Comment:

This bug has been fixed in CVS.

In case this was a PHP problem, snapshots of the sources are packaged
every three hours; this change will be in the next snapshot. You can
grab the snapshot at http://snaps.php.net/.
 
In case this was a documentation problem, the fix will show up soon at
http://www.php.net/manual/.

In case this was a PHP.net website problem, the change will show
up on the PHP.net site and on the mirror sites in short time.
 
Thank you for the report, and for helping us make PHP better.




Previous Comments:
------------------------------------------------------------------------

[2002-12-03 18:22:24] [EMAIL PROTECTED]

Marking as critical as this bug causes autoglobals 
to be unreliable.



------------------------------------------------------------------------

[2002-12-03 14:31:19] [EMAIL PROTECTED]

Just verified this bug, so:

a) Only arrays are affected.
b) Only affected if register_globals = on
c) This is a bug, $_GET for example should never have a
   COOKIE value it in.

Here's another piece of test code, and the results with
register_globals = on.  When register_globals = off, everything works
as expected.


<?php
  setcookie("a[foo]","I_AM_A_COOKIE");
  setcookie("b", "I_AM_ALSO_A_COOKIE");
  setcookie("c", "bar");
?>
<FORM METHOD="POST"
ACTION="print_gpc?a[foo]=a_get_vale&b=another_get&c=bar">
  <input type="hidden" name="a[foo]" value="a_post_value">
  <input type="hidden" name="b" value="another_post">
  <input type="hidden" name="c" value="bar">
  <input type="submit" name="submit" value="submit">
</FORM>

And:

<pre>
<?php
echo "\nGET\n";     print_r($_GET);
echo "\nPOST\n";    print_r($_POST);
echo "\nCOOKIE\n";  print_r($_COOKIE);
echo "\nREQUEST\n"; print_r($_REQUEST);
?>
</pre>

Provides us with:

GET
Array
(
    [a] => Array
        (
            [foo] => I_AM_A_COOKIE
        )

    [b] => another_get
    [c] => bar
)

POST
Array
(
    [a] => Array
        (
            [foo] => I_AM_A_COOKIE
        )

    [b] => another_post
    [c] => bar
    [submit] => submit
)

COOKIE
Array
(
    [a] => Array
        (
            [foo] => I_AM_A_COOKIE
        )

    [b] => I_AM_ALSO_A_COOKIE
    [c] => bar
)

REQUEST
Array
(
    [a] => Array
        (
            [foo] => I_AM_A_COOKIE
        )

    [b] => I_AM_ALSO_A_COOKIE
    [c] => bar
    [submit] => submit
)

$_REQUEST of course works as expected according to the variables_order
directive.




------------------------------------------------------------------------

[2002-12-03 13:28:47] [EMAIL PROTECTED]

Thank you for taking the time to write to us, but this is not
a bug. Please double-check the documentation available at
http://www.php.net/manual/ and the instructions on how to report
a bug at http://bugs.php.net/how-to-report.php

This is why register_globals is dangerous, if there are variables with
the same name they get over-written. This is why you should keep it
off.
You can control the order of the way variables passed via
GET/POST/COOKIE/FILES are registered via the gpc_order ini setting.

------------------------------------------------------------------------

[2002-12-03 12:25:22] [EMAIL PROTECTED]

With register_globals turned on, if 3 variables WITH THE
SAME NAME are defined in your script (one as a Get
variable, one as a Post variable and one as a Cookie
variable) and if this name is an ARRAY ELEMENT (let's
say foo[ab]), then $_GET["foo"]["ab"] and
$_POST["foo"]["ab"] will both be set to $_COOKIE["foo"]["ab"].

Let's try it.

First, write the script "print_gpc.php" :

<?php
echo '$_GET';
echo "<PRE>";
print_r($_GET);
echo "</PRE>";

echo '$_POST';
echo "<PRE>";
print_r($_POST);
echo "</PRE>";

echo '$_COOKIE';
echo "<PRE>";
print_r($_COOKIE);
echo "</PRE>";
?>

Then call the form below ("test.php") in your browser :

<?php setcookie("foo[ab]","I_am_a_cookie"); ?>
<FORM METHOD="POST" ACTION="print_gpc.php?foo[ab]=I_am_a_get_value">
<INPUT TYPE="submit" NAME="foo[ab]" VALUE="OK">
</FORM>

and clic on the OK button.

If you have register_globals turned off, you will see
what you expect :

$_GET

Array
(
    [foo] => Array
        (
            [ab] => I_am_a_get_value
        )

)

$_POST

Array
(
    [foo] => Array
        (
            [ab] => OK
        )

)

$_COOKIE

Array
(
    [foo] => Array
        (
            [ab] => I_am_a_cookie
        )

)

but if you have register_globals turned on,
you will have $_GET["foo"]["ab"] == "I_am_a_cookie"
and $_POST["foo"]["ab"] == "I_am_a_cookie".

Strangly, this problem does not occur if the cookie name
is NOT an array element EVEN if register_globals is
turned On. (Try to replace "foo[ab]" by "foo" in the
"test.php" form.)



------------------------------------------------------------------------


-- 
Edit this bug report at http://bugs.php.net/?id=20796&edit=1

Reply via email to