PHP Unconference Europe 2015

Questions diverses

Il y'a quelques questions inclassables. Vous les trouverez ici.

Comment puis-je manipuler le manuel compressé en bzip2 sous Windows ?

Si vous n'avez pas d'outil d'archivage prenant en charge les fichiers au format bz2, » téléchargez l'outil en ligne de commande à partir de Redhat (merci de lire les informations plus bas).

Si vous préférez ne pas utiliser d'outil en ligne de commande, vous pouvez essayer des outils gratuits comme » Stuffit Expander, » UltimateZip, » 7-Zip, ou » Quick Zip. Si vous avez des outils comme » WinRAR ou » Power Archiver, vous pouvez facilement décompresser les fichiers bz2 avec. Si vous utilisez Total Commander (autrefois Windows Commander), un plugin bz2 est disponible gratuitement sur le site de » Total Commander.

L'outil en ligne commande bzip2 de Redhat :

Les utilisateurs du service pack 2 de Win2K doivent prendre la version 1.0.2, tous les autres utilisateurs de Windows doivent prendre la version 1.00. Après avoir téléchargé, renommez l'exécutable en bzip2.exe. Pour votre convenance, mettez-le dans un dossier dans votre path, c'est à dire C:\Windows où C représente votre disque où Windows est installé.

Note : Dans ce qui suit, lang représente votre langue et x le format désiré, par exemple : pdf. Pour décompresser php_manual_lang.x.bz2 suivez les instructions suivantes :

  • ouvrez un invite de commande
  • déplacez-vous dans le dossier où se trouvent les fichiers php_manual_lang.x.bz2
  • lancez la commande bzip2 -d php_manual_lang.x.bz2, pour extraire php_manual_lang.x dans ce même dossier

Dans le cas où vous avez téléchargé le fichier php_manual_lang.tar.bz2 avec beaucoup de fichiers HTML à l'intérieur, la procédure est la même. La seule différence est que vous obtiendrez un fichier php_manual_lang.tar. Le format tar est connu pour être pris en compte par la plupart des archiveurs de Windows, comme » WinZip.

Que signifie le caractère "&" devant les arguments dans les déclarations des fonctions comme la fonction asort() ?

Cela signifie que cet argument est passé par référence et que la fonction le modifiera, comme expliqué dans la documentation. Vous pouvez passer uniquement des variables de cette façon et vous n'avez pas besoin de les passer avec le caractère "&" dans l'appel de la fonction (car obsolète).

Comment puis-je gérer la directive register_globals ?

Pour plus d'informations concernant l'implication sur la sécurité de la directive register_globals, lisez le chapitre sur la sécurité concernant l'utilisation de register_globals.

Il est préférable d'utiliser les superglobals, plutôt que de remettre à on la directive register_globals.

Si vous êtes sur un serveur mutualisé avec la directive register_globals de positionnée à off et que vous devez utiliser des applications qui requièrent que cette option soit à on ou si vous êtes hébergés sur un serveur qui a cette directive d'activée mais que vous voudriez éliminer ce risque sécuritaire, vous devriez émuler l'argument opposé avec PHP. C'est toujours une bonne idée que de demander tout d'abord s'il est possible de modifier cette option dans la configuration de PHP mais si cela n'est pas possible, vous pouvez utiliser ces astuces de compatibilité.

Exemple #1 Émulation des Register Globals

Ceci émulera la directive register_globals à On. Si vous modifiez la directive variables_order, modifiez la variable $superglobals pour qu'elle corresponde à votre nouvelle directive..

<?php
// Émulation de register_globals à on
if (!ini_get('register_globals')) {
    
$superglobals = array($_SERVER$_ENV,
        
$_FILES$_COOKIE$_POST$_GET);
    if (isset(
$_SESSION)) {
        
array_unshift($superglobals$_SESSION);
    }
    foreach (
$superglobals as $superglobal) {
        
extract($superglobalEXTR_SKIP);
    }
}
?>

Ceci émulera register_globals à Off. Gardez à l'esprit que ce code doit être appelé au tout début de votre script ou après la fonction session_start() si vous l'utilisez pour commencer votre session.

<?php
// Émulation de register_globals à off
function unregister_GLOBALS()
{
    if (!
ini_get('register_globals')) {
        return;
    }

    
// Vous pouvez vouloir modifier cela pour avoir une erreur plus jolie
    
if (isset($_REQUEST['GLOBALS']) || isset($_FILES['GLOBALS'])) {
    die(
'Tentative d\'effacement des GLOBALS détectée');
    }

    
// Les variables à ne jamais effacer
    
$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();

?>

add a note add a note

User Contributed Notes 3 notes

up
1
doerr at apkk dot de
3 years ago
If you only needed register_globals for get/post variables, the effictive solution for 5.3 is:
  import_request_variables("GPC", "");

But if the skripts relied on session_register() you'll have to do more:
- Replace all variables that appeared after session_register with _SESSION equivalents - so $myvar becomes $_SESSION['myvar']
- Take care if your variables appeared inside strings - 'Hello $user !' works, but 'Hello $_SESSION['user'] !' not - so you have to concatenate the string: 'Hello '.$_SESSION['user'] .' !'
- Session variables in function declarations (for whatever purpose) will not work - keeping the old (local) names will work in most cases.
- Finally, replace the session_register(..) line with session_start()
up
1
php at REMOVEMEkennel17 dot co dot uk
9 years ago
Regarding simulating register_globals = off, note that it is impossible to adequately prevent $_SESSION variables from being globalised, as the array (and thus the globals) are created on a call to session_start().  You would therefore have to 'undo' this when you start a session as using it at the start of your script will have no effect.

To avoid potential problems, use a prefix that is unique for all session variables (e.g. 'SESS_'), and only access them via the $_SESSION array.  The prefix ensures that you don't have a naming clash (and therefore a security risk) with any non-session globals.
up
0
markus
9 years ago
Considering the comment below. I think there's a way to avoid that "problem":

<?php
//
// $starttime is an example of a variable that we might need to define,
// even before, running the "register_globals OFF" emulator below.
//
list($msec, $sec) = explode(' ', microtime());
$starttime = ((float)$msec + (float)$sec);

//
// If register_globals is ON, ensure no unexpected globals are defined.
// ie. We'll try to emulate a register_globals OFF environment.
//
if( (bool)@ini_get('register_globals') )
{
   
$superglobals = array($_ENV, $_GET, $_POST, $_COOKIE, $_FILES, $_SERVER);
    if( isset(
$_SESSION) )
    {
       
array_unshift($superglobals, $_SESSION);
    }
   
$knownglobals = array(
       
//
        // Known PHP Reserved globals and superglobals:
        //
       
'_ENV',        'HTTP_ENV_VARS',
       
'_GET',        'HTTP_GET_VARS',
       
'_POST',    'HTTP_POST_VARS',
       
'_COOKIE',    'HTTP_COOKIE_VARS',
       
'_FILES',    'HTTP_FILES_VARS',
       
'_SERVER',    'HTTP_SERVER_VARS',
       
'_SESSION',    'HTTP_SESSION_VARS',
       
'_REQUEST',

       
//
        // Global variables used by this code snippet:
        //
       
'superglobals',
       
'knownglobals',
       
'superglobal',
       
'global',
       
'void',

       
//
        // Known global variables defined before this code snippet is reached.
        //
       
'starttime',
    );
    foreach(
$superglobals as $superglobal )
    {
        foreach(
$superglobal as $global => $void )
        {
            if( !
in_array($global, $knownglobals) )
            {
                unset(
$GLOBALS[$global]);
            }
        }
    }
}
?>

Note the stuff related to the $_SESSION array depends on whether the PHP session has been started or not. You might want to call session_start() before this point (or set session.auto_start ON).

HTH+ :)
To Top