Глава 61. Разные вопросы

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

1. Как я могу обращаться со сжатыми bz2 руководствами под Windows?
2. Что означает & рядом с аргументом в объявлении функции, например asort()?
3. Как обращаться с register_globals?

1. Как я могу обращаться со сжатыми 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, следуйте этим простым инструкциям:

  • откройте окно запроса команды (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.

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

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

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

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

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

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

Пример 61-1. Эмулирование Register Globals

Следующее эмулирует register_globals установленную в On.

<?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($superglobal, EXTR_SKIP);
   }
  
ini_set('register_globals', true);
}
?>

Следующее эмулирует register_globals установленную в Off.

<?php
// Emulate register_globals off
if (ini_get('register_globals')) {
  
$superglobals = array($_SERVER, $_ENV,
      
$_FILES, $_COOKIE, $_POST, $_GET);
   if (isset(
$_SESSION)) {
      
array_unshift($superglobals, $_SESSION);
   }
   foreach (
$superglobals as $superglobal) {
       foreach (
$superglobal as $global => $value) {
           unset(
$GLOBALS[$global]);
       }
   }
  
ini_set('register_globals', false);
}
?>



Разные вопросы
19-Jul-2005 09:08
using .htaccess file to disable register globals (register_globals)

The syntax for setting an option is:

php_value name value
php_flag name on or off

Example:

php_flag register_globals off
php_value arg_separator.output &amp;

The example turns off register_globals and sets the value of arg_separator.output to &amp; which is preferred rather than the default &.

Note: you can also set boolean options with the php_value directive, the string will be converted to boolean before assignment.

you can also use .htaccess to  turn magic quotes on or off.
Search php.net and you'll find it
markus
18-Jun-2005 03:34
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+ :)
php at REMOVEMEkennel17 dot co dot uk
12-Apr-2005 08:22
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.
Juhapekka Tolvanen
18-Feb-2005 11:34
I added many links to software that can at least decompress Bzip2-files here:

http://en.wikipedia.org/wiki/Bzip2

<Переход из PHP 4 в PHP 5Приложения>
 Last updated: Tue, 15 Nov 2005