I'm reading a book on php security, and on input validation chapter there's a small section that talks about only allowing expected input.
This is the code that they show:
<?php
$expected = array( 'carModel', 'year', 'bodyStyle' );
foreach( $expected AS $key ) {
if ( !empty( $_POST[ $key ] ) ) {
${$key} = $_POST[ $key ];
}
else {
${$key} = NULL;
}
}
?>
I'm kind of confused, there's a small paragraph that explains what the code does. For what I get it assigns a value from the array as a key to $_POST. It also says that the array should be done programatically copied out of the GPC array.
What I don't understand is in what cases should I use this? And what is the GPC array?
The code creates variables from data in the $_POST
array. The names of the variables are taken from the keys of the $_POST
array. PHP calls this (i.e. naming variables dynamically) variable variables.
This is usually a bad idea, because you do not control, which keys are present in the $_POST
array, and thus, which variables are created. The user of your website controls this. A malicious user might name the POST variables in such a way that they overwrite variables that you intended for different purposes.
The book suggests to allow keys in the $_POST
array to overwrite variables in a controlled manner. That's what $expected = array('carModel', 'year', 'bodyStyle')
is for. This and the following code only creates the variables $carModel
, $year
and $bodyStyle
. If, for example, a user posts current_user_has_admin_rights=1
to you application, a variable $current_user_has_admin_rights
with a value of 1 will not be created.
My suggestion is to to stay away from variable variables alltogether and instead access the POST values through the $_POST
array only. This makes it clear where the value comes from, an thus makes it easier to spot if such a value is handled in an unsecure manner.