Trattare con register_globals
-
19-09-2019 - |
Domanda
Non sono sicuro che sarebbe bello essere contrassegnato come wiki della comunità, ma comunque:
C'è un modo semplice per uccidere il registro_globals? Sto lavorando su un framework PHP e in questo momento, ho semplicemente impostato lo script per terminare se register_globals è acceso. Anche se preferisco costringere le persone a disabilitarlo, lì sono server che lo hanno ancora.
So che in PHP 5.3.0 Register_Globals è deprecato e in PHP 6 sarà completamente rimosso, ma è sempre una buona cosa affrontarlo mentre è ancora qui.
Ho visto alcuni modi e attualmente sto pensando di usare questo:
$temp = array_merge($_GET, $_POST, $_COOKIE); foreach($temp as $k => $v) { if(isset($$k)) unset($$k); }
Ci sono alcuni problemi qui, però. È un incentivo delle risorse, specialmente quando ci sono molti dati di input. Non sono sicuro se la disabilitazione in fase di esecuzione funzionerebbe, ad esempio:
ini_set('register_globals', 'Off')
Esiste un modo migliore di cui non ho sentito parlare per sbarazzarmi di Register_Globals? Grazie.
Soluzione
Esistono metodi per trattare con register_globals descritto nel manuale PHP. Il register_globals
Impostazione INI Non posso essere impostato in fase di esecuzione di ini_set()
, quindi se non puoi farlo con un file di configurazione .htaccess o server Web, il metodo fornito ci sarebbe la soluzione ufficiale.
Fondamentalmente fornisce questo frammento di codice per emulare la compatibilità:
<?php
// Emulate register_globals off
function unregister_GLOBALS()
{
if (!ini_get('register_globals')) {
return;
}
// Might want to change this perhaps to a nicer error
if (isset($_REQUEST['GLOBALS']) || isset($_FILES['GLOBALS'])) {
die('GLOBALS overwrite attempt detected');
}
// Variables that shouldn't be unset
$noUnset = array('GLOBALS', '_GET',
'_POST', '_COOKIE',
'_REQUEST', '_SERVER',
'_ENV', '_FILES');
$input = array_merge($_GET, $_POST,
$_COOKIE, $_SERVER,
$_ENV, $_FILES,
isset($_SESSION) && is_array($_SESSION) ? $_SESSION : array());
foreach ($input as $k => $v) {
if (!in_array($k, $noUnset) && isset($GLOBALS[$k])) {
unset($GLOBALS[$k]);
}
}
}
unregister_GLOBALS();
?>
Altri suggerimenti
Potresti aggiungere php_flag register_globals off
al tuo file .htaccess, sebbene non tutti i server lo accettino. Quindi, se hai intenzione di pubblicare il tuo framework, potrebbe non essere una buona idea.