$ var вместо $ _GET ['var'] в PHP? - PullRequest
       47

$ var вместо $ _GET ['var'] в PHP?

3 голосов
/ 22 сентября 2009

Хорошо, я не могу вспомнить подробности об этом, но на некоторых серверах вы можете использовать

$ var вместо $ _ GET ['var'] для доступа к переменной в URL, я знаю, что это ПЛОХО, но я не могу вспомнить, почему это плохо?

Ответы [ 10 ]

8 голосов
/ 22 сентября 2009

Я думаю, что вы имеете в виду Зарегистрировать глобалы .

Вы не должны их использовать, потому что не можете различить источник значений этой переменной, поскольку они могут поступать из любого источника переменных EGPCS (Environment, GET, POST, Cookie, Server).

Таким образом, если у вас есть $var, вы не можете сказать, является ли значение $_ENV['var'], $_GET['var'], $_POST['var'], $_COOKIE['var'] или $_SERVER['var'].

7 голосов
/ 22 сентября 2009

Эта функция называется Регистрировать глобальные переменные и позволяет людям вводить переменные в ваш код. См. документацию для примеров; вот один:

<?php
// define $authorized = true only if user is authenticated
if (authenticated_user()) {
    $authorized = true;
}

// Because we didn't first initialize $authorized as false, this might be
// defined through register_globals, like from GET auth.php?authorized=1
// So, anyone can be seen as authenticated!
if ($authorized) {
    include "/highly/sensitive/data.php";
}
?>
2 голосов
/ 22 сентября 2009

Вы можете использовать это, если на вашем сервере register_globals установлено в 1 (или true) в файле php.ini.

В какой-то момент это начало отключаться по умолчанию, и приложения начали ломаться, что является причиной плохой практики.

Вы можете увидеть список php.ini переменных здесь .

1 голос
/ 22 сентября 2009

Это плохо, потому что если вы не будете осторожны при инициализации каждой переменной перед ее использованием (то, что PHP не заставит вас делать), люди могут легко заставить ваш код выполнять очень плохие вещи с помощью простого запроса: /myapp/index.php?admin_privileges=1.

1 голос
/ 22 сентября 2009

Потому что позволить людям вводить значения в произвольные переменные - это очень плохо. Вы можете хранить там что угодно, и они могут перезаписать некоторую ценность, которая ставит под угрозу вашу безопасность. Не забудьте использовать isset, чтобы проверить, что значение было установлено, прежде чем пытаться его использовать.

1 голос
/ 22 сентября 2009

Это также плохо, потому что вы можете спутать себя с тем, как PHP будет определять ваши переменные. Вы можете перезаписать данные, если не будете осторожны. Кроме того, использование $ _GET намного яснее в отношении того, чего вы пытаетесь достичь.

0 голосов
/ 22 сентября 2009

Регистрируют глобальные переменные, но исчезнет в следующей версии PHP. Не говоря уже о том, что включать его действительно неправильно.

Вы можете использовать extract () для более контролируемого поведения. Он извлечет ключи из массива (в данном случае $ _GET) в локальный контекст как переменные. Вы можете дать им общий префикс, чтобы они не конфликтовали с вашими существующими переменными. И вы можете предварительно отфильтровать массив, чтобы убедиться, что вы получаете только ожидаемые переменные.

int extract( $var_array [, $type = EXTR_OVERWRITE [, $prefix  ]] )

Импорт переменных из массива в текущую таблицу символов.

0 голосов
/ 22 сентября 2009

Как только вы привыкнете использовать $ _POST, $ _GET и т. Д., Цель вашего кода будет легче читать и намного, намного легче поддерживать.

0 голосов
/ 22 сентября 2009

Если вы можете сделать это, тогда «register_globals» включен. Это плохо, потому что вы не будете знать, откуда взялась переменная, и она смешивает ваши переменные с переменными, которые любой пользователь может внедрить через URL. Подробнее здесь: http://www.php.net/manual/en/security.globals.php

0 голосов
/ 22 сентября 2009

Настройка называется REGISTER_GLOBALS, и она обсуждалась здесь:

Почему REGISTER_GLOBALS так плоха?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...