ConFoo: Call for paper is now Open

Preguntas Varias

Puede que existan algunas preguntas que no podemos colocar en otras categorías. Este es el lugar en donde puede encontrarlas.

¿Cómo puedo manipular los manuales comprimidos mediante bz2 en Windows?

Si no cuenta con una herramienta de archivación que pueda manejar archivos bz2, » descargue la herramienta de línea de comandos de RedHat (por favor refiérase a la inforamción presentada más adelante).

Si no desea usar una herramienta de línea de comandos, puede probar herramientas gratuitas como » Stuffit Expander, » UltimateZip, » 7-Zip, o » Quick Zip. Si dispone de herramientas como » WinRAR o » Power Archiver, puede descomprimir fácilmente archivos bz2 con ellas. Si usa Total Commander (anteriormente Windows Commander), un módulo adicional para ese programa se encuentra disponible de forma gratuita desde el sitio de » Total Commander.

La herramienta bzip2 de línea de comandos por Redhat:

Los usuarios de Win2k Sp2 deben obtener la versión más reciente, 1.0.2, todos los demás usuarios de Windows deben obtener la versión 1.00. Después de la descarga, renombre el ejecutable a bzip2.exe. Para mayor conveniencia, colóquelo en un directorio que sea parte de sus rutas predeterminadas, p.ej. C:\Windows, en donde C representa la unidad en donde se encuentra su instalación de Windows.

Nota: lang representa su lenguaje, y x el formato deseado, p.ej: pdf. Para descomprimir el archivo php_manual_lang.x.bz2 siga las siguientes instrucciones:

  • abra una ventana con el intérprete de comandos
  • cambie de directorio hacia la carpeta en donde almacenó el archivo php_manual_lang.x.bz2 descargado
  • invoque bzip2 -d php_manual_lang.x.bz2, extrayendo de este modo php_manual_lang.x en la misma carpeta

En caso de que haya descargado el archivo php_manual_lang.tar.bz2 con varios archivos html en su interior, el procedimiento es el mismo. La única diferencia es que recibe un archivo php_manual_lang.tar. Se conoce que el formato tar es tratado por la mayoría de archivadores en Windows, como por ejemplo » WinZip.

¿Qué significa un signo & al lado de un argumento en la declaración de una función, como p.ej. asort()?

Quiere decir que el argumento es pasado por referencia y es probable que la función modifique el argumento de acuerdo con la documentación. Sólo puede pasar variables de este modo y no necesita pasarlas con el signo & en la llamada de la función (tal cosa es considerada obsoleta).

¿Cómo manejo el parámetro register_globals?

Para información sobre las implicaciones de seguridad de register_globals, lea el capítulo de seguridad sobre el Uso de register_globals.

Es recomendable usar superglobales, en lugar de depender en la activación de register_globals.

Si se encuentra en un servidor compartido con register_globals desactivado y necesita usar aplicaciones antiguas, que requieren que esta opción esté activada, o se encuentra en algún servidor de hospedaje en donde esta característica está habilitada, pero quisiera eliminar los riesgos de seguridad, puede que necesite emular el valor opuesto en PHP. Siempre es buena idea preguntar primero si es posible cambiar la opción de alguna forma en la configuración de PHP, pero si no es posible, entonces puede usar estos segmentos de compatibilidad.

Ejemplo #1 Emulación de Register Globals

Esto emula el comportamiento de register_globals On. Si ha alterado la directiva variables_order, considere modificar $superglobales acordemente.

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

Esto emula register_globals Off. Tenga en cuenta que este código debe ser llamado al comienzo absoluto de su script, o después de session_start(), si usa esa función para comenzar su sesión.

<?php
// Emular register_globals off
function retirar_registros_GLOBALS()
{
    if (!
ini_get('register_globals')) {
        return;
    }

    
// Puede que desee cambiar esto por un error más amigable
    
if (isset($_REQUEST['GLOBALS']) || isset($_FILES['GLOBALS'])) {
        die(
'Se ha detectado un intento de sobreescritura en GLOBALS');
    }

    
// Variables que no deben ser eliminadas
    
$noEliminar = array('GLOBALS',  '_GET',
                        
'_POST',    '_COOKIE',
                        
'_REQUEST''_SERVER',
                        
'_ENV',     '_FILES');

    
$entrada array_merge($_GET,    $_POST,
                           
$_COOKIE$_SERVER,
                           
$_ENV,    $_FILES,
                           isset(
$_SESSION) && is_array($_SESSION) ? $_SESSION : array());

    foreach (
$entrada as $c => $v) {
        if (!
in_array($c$noEliminar) && isset($GLOBALS[$c])) {
            unset(
$GLOBALS[$c]);
        }
    }
}

retirar_registros_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