[man]register_globals[/man] being off (which is default for some time now) takes care of this problem.
a long time ago in php, say i have a variable in my script called $isAdmin. The person could easily change the value of this by calling myscript.php?isAdmin=1. With no register_globals, the get variable, is made global (it is called $isAdmin) inside my program. the problem with that is if i dont initialize the variable in some cases, they may be able to make themselves admin by doing that.
with register_globals on, myscript.php?isAdmin=1 would not make $isAdmin, but it would make $GET['isAdmin']. Similarly with post, you have $POST['isAdmin']. This helps secure applications because if I do use a variable called $isAdmin in my script, and they try putting that in the url, I now have two variables $isAdmin and $GET['isAdmin'] which are two different things, so
if ($isAdmin == 1) { //show admin interface
would not work if they passed it in the url via get, because $GET['isAdmin'] is a separate variable from $isAdmin.