PHP 7.2.0 Release Candidate 4 Released

Разные вопросы

Некоторые вопросы могут не подходить для других категорий. Вы можете найти их здесь.

Как обращаться со сжатыми bz2 руководствами под Windows?

Если у вас нет архиватора для работы с bz2 файлами, то » скачайте утилиту для командной строки от Redhat (пожалуйста, ищите подробности ниже).

Если вы не хотите использовать утилиту командной строки, вы можете попробовать бесплатные средства, такие как » Stuffit Expander, » UltimateZip, » 7-Zip или » Quick Zip. Если у вас есть такие утилиты как » WinRAR или » Power Archiver, то с их помощью вы можете легко распаковать bz2 файлы. Если вы пользуетесь Total Commander (бывший Windows Commander), подключаемый модуль bz2 для этой программы доступен бесплатно с сайта » Total Commander.

Утилита командной строки bzip2 от Redhat:

Пользователи Win2K Sp2 должны взять последнюю версию 1.0.2, пользователи всех других Windows должны взять версию 1.00. После загрузки переименуйте исполняемый файл в bzip2.exe. Для удобства положите его в директорию в вашем пути, например C:\Windows, где C соответствует диску, на котором установлен ваш Windows.

Замечание: lang обозначает ваш язык и x - желаемый формат, например pdf. Чтобы распаковать php_manual_lang.x.bz2, следуйте этим простым инструкциям:

  • откройте окно c командной строкой (command prompt)
  • перейдите в директорию (команда cd), куда вы сохранили скачанный php_manual_lang.x.bz2
  • вызовите bzip2 -d php_manual_lang.x.bz2 для извлечения php_manual_lang.x в ту же директорию

В случае, если вы скачали php_manual_lang.tar.bz2, содержащий множество html файлов, процедура точно такая же. Единственное отличие заключается в том, что вы получили файл php_manual_lang.tar. Известно, что формат tar обрабатывается большинством распространенных архиваторов под Windows, например такими как » WinZip.

Что означает & рядом с аргументом в объявлении функции, например asort()?

Это означает, что аргумент передается по ссылке и функция, вероятно, изменит его согласно документации. Таким путем вы можете передать только переменные и вам не обязательно задавать & при вызове функции (и это даже не рекомендуется).

Как обращаться с register_globals?

Для информации по проблемам безопасности, связанных с register_globals, читайте Использование register_globals в главе "Безопасность".

Предпочтительнее использовать superglobals, чем полагаться на то, что register_globals установлена в On.

Если вы пользуетесь виртуальным (shared) хостингом с выключенной register_globals и вам надо использовать некоторые существующие приложения, которые требуют, чтобы эта опция была включена; или вы на каком-либо сервере, где эта возможность включена, но вы хотите эмулировать проблему по безопасности, то возможно вам надо эмулировать противоположную установку с помощью PHP. Всегда лучше сначала спросить, если можно каким-либо образом изменить опцию в конфигурации PHP, но если это невозможно, то вы можете воспользоваться следующими совместимыми кусками кода.

Пример #1 Эмулирование Register Globals

Следующее эмулирует register_globals установленную в On. Если вы меняли директиву variables_order, измените соответственно и $superglobals.

<?php
// Emulate 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);
    }
}
?>

Следующее эмулирует register_globals установленную в Off. Помните, что этот код должен вызываться в самом начале вашего скрипта, или после вызова session_start(), если вы используете сессии.

<?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();

?>

add a note add a note

User Contributed Notes 3 notes

up
2
doerr at apkk dot de
6 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
12 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
-2
markus
12 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