register_globals = On опасно?

Статус
В этой теме нельзя размещать новые ответы.

Vitaliyzp

Постоялец
Регистрация
24 Янв 2008
Сообщения
56
Реакции
9
Сейчас делаем сайт на joomla, ей в приниципе этот параметр не критичен. Но на нашем сервере есть старые сайты, которые не работают, если выключить register_globals.
Большая ли это дыра в безопастности сервера? И много ли нужно перелопатить кода движка, чтобы он заработал при register_globals = Off ?
 
Переделывайте скрипты под настройку register globals в Off. В 6й версии PHP эта настройка убрана с установленным по умолчанию Выключено.
 
эмуляция директив
PHP:
/**
* Эмуляция register globals = off
*/
function unregister_globals () {
	$REQUEST = $_REQUEST;
	$GET = $_GET;
	$POST = $_POST;
	$COOKIE = $_COOKIE;
	if (isset ( $_SESSION )) {
		$SESSION = $_SESSION;
	}
	$FILES = $_FILES;
	$ENV = $_ENV;
	$SERVER = $_SERVER;
	foreach ($GLOBALS as $key => $value) {
		if ( $key != 'GLOBALS' ) {
			unset ( $GLOBALS [ $key ] );
		}
	}
	$_REQUEST = $REQUEST;
	$_GET = $GET;
	$_POST = $POST;
	$_COOKIE = $COOKIE;
	if (isset ( $SESSION )) {
		$_SESSION = $SESSION;
	}
	$_FILES = $FILES;
	$_ENV = $ENV;
	$_SERVER = $SERVER;
}
а обратная процедура это изъятие всех элементов
 
Думаю это не так критично к смописным ресурсам, так как нет доступа к исходному коду, неизвестно какую переменную куда нужно вставить, а для готовых двигалов, это поненцеальная опасность...
Хостинги постепенно начинают отказыватся от Рег. Глобалс, например Mastehost c месяц назад перевел все сайты в Reg Glob=OFF, пришлось прописывать везде... через .htccess php_flag register_globals on
 
обычно, если скрипт пишется на скорую руку, бывают примерно такие ошибки:
PHP:
if($_GET['id']==intval($_GET['id'])){
  mysql_query("select .... from ... where id=$id");
}
Т.е. проверяется только параметр $_GET['id']. Но если послать вместе с $_GET['id'] еще и $_POST['id'], то можно провести sql-inj и т.п.
Но если скрипты изначально были заточены для безопасности, то волноваться не стоит. ;)
 
  • Заблокирован
  • #7
Регистр-глобал = ОН опасен только для криворуких программистов. Если ты будешь на достаточном уровне фильтровать GPC и не будешь держать неприсвоенные переменные в скрипте, то все тру и волноваться тебе не о чем
 
Выключение глобалсов обязывает программиста более внимательно относиться к передаваемым переменным.
Кроме того, исключает множество ошибок, когда программист забыл проверить переменную перед использованием.
Как правило, в первых скриптах после "hello, world!" программисты начинают использовать переменные, и конечно их не проверяют.
Без глобалсов значения переменных нужно специально выбирать в зависимости от выбранного метода полечения их скриптом (GET, POST или COOKIE).

обычно, если скрипт пишется на скорую руку, бывают примерно такие ошибки:
PHP:
if($_GET['id']==intval($_GET['id'])){
  mysql_query("select .... from ... where id=$id");
}
Т.е. проверяется только параметр $_GET['id']. Но если послать вместе с $_GET['id'] еще и $_POST['id'], то можно провести sql-inj и т.п.
Но если скрипты изначально были заточены для безопасности, то волноваться не стоит. ;)
Всё что идёт в запрос SQL должно фильтроваться.
Приведённый пример сработает только при включённых глобалсах или если $id чему-то равен до этого кода.
Ошибка программиста в том, что он не "вспомнил" о методах POST и COOKIE, а также о том, что значение (intval($_GET['id']) == $_GET['id']), если даже ничего в GET нет, будет true.

В приведённом примере достаточно поменять код на:
PHP:
$id=intval($_GET['id']);
if ($id) {
  mysql_query("select .... from ... where id=$id");
}
чтобы исключить опасный конфуз возможностью инъекта через POST.
 
У джумлы есть свой эмулятор register_globals.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху