Я разрабатываю новый веб-сайт для своей компании и пытаюсь реализовать переключение навигации, которое я использовал на всех своих сайтах в прошлом.
<?php
switch($x) {
default:
include("inc/main.php");
break;
case "products":
include("inc/products.php");
break;
}
?>
По какой-то причине, когда я перехожу к index.php? X = products, ничего не происходит, он по-прежнему отображает inc / main.php, другими словами, он не обнаружил переменную X из URL-адреса. Это как-то связано с глобальными переменными?






Да, в вашей конфигурации PHP правильно отключил register_globals, потому что это невероятно небезопасно.
Просто поставьте:
$x = $_REQUEST['x']
вверху вашего скрипта.
Вы также можете использовать $_GET, если хотите, чтобы это работало только для метода HTTP GET. Я видел, как некоторые люди утверждали, что $_REQUEST чем-то небезопасен, но нет доказательств, подтверждающих это.
Лучше использовать $ _GET, а не $ _REQUEST ... $ _REQUEST не так плох, как register_globals, но все же дает неприятный запах. Он знает, что использует URL-адрес var и, по-видимому, не хочет, чтобы файлы cookie или параметры POST меняли его режим просмотра, поэтому ему следует использовать $ _GET, а не $ _REQUEST.
Я также слышал, что это небезопасно, но потом я подумал, почему почти все веб-серверы или пакеты хостинга, за которые я когда-либо платил, включали их?
Чтобы быть более конкретным, чем "неприятный запах" (ограничение количества символов комментария SO), $ _REQUEST подвержен атакам XSS, поскольку файлы cookie могут быть установлены на стороне клиента.
интересно - я забыл, что $ _REQUEST также включает файлы cookie. Однако в этом случае я не вижу никакого риска.
@ zuk1, он был включен по умолчанию в PHP4, и от его включения зависело множество (плохих) приложений. PHP5 отключен по умолчанию, но некоторые хосты снова включают его для совместимости с (плохими) приложениями. Им легче сделать это, чем иметь дело с такими клиентами, как вы, спрашивая их, почему мои приложения перестали работать.
@Alnitak, окей, я откопал доклад, который более красноречиво объясняет всевозможные атаки $ _REQUEST, чем я :) slideshare.net/ZendCon/…
Вы должны использовать $ _GET для чтения этих переменных. Существует устаревшая функция под названием register_globals, но я бы определенно не советовал использовать ее, поскольку это потенциальный риск для безопасности.
Похоже, что все ваши предыдущие веб-хосты использовали register_globals, и ваш код полагается на это. Это параметр опасный, который был по праву удален в PHP 6.0! Вместо этого используйте switch($_GET['x']) {.
Вы можете использовать http://php.net/manual/es/function.extract.php для извлечения переменных, если хотите, но имейте в виду, что это позволяет любому пользователю устанавливать переменные с тем содержанием, которое они хотят в вашем скрипте, что делает его таким же небезопасным, как использование register_globals
Если это большой сайт, вам следует подумать об использовании такого фреймворка, как CodeIgniter - он сделает много такой работы за вас. Как говорится, велосипед не изобретать :)