@deshkovichR
Я хочу развиваться как программист :)

Возможно ли подделать переменную $_SERVER?

Всем привет. Я еще не очень опытный PHP-программист. Скорее отношусь к Junior. Раньше писал на Notepad++, а сейчас перешел в NetBeans 8.1

Я всегда в любых своих проектах использовал данные из массива $_SERVER напрямую.
Пример:
require_once $_SERVER['DOCUMENT_ROOT'].'/папка/файл.php'


При такой записи в NetBeans появляется предупреждение:
Не обращайтесь непосредственно к суперглобальному массиву $_SERVER.
Вместо этого можно использовать функции фильтрации (например, filter_input(), conditions with id_*() functions и др.


Исходя из этого возникает вопрос. На сколько это оправдано?
Что любые входные данные, будь то Cookies, get или post запросы и др. нужно обрабатывать перед их использованием, я знаю и стараюсь делать это по мере знаний.

Но, что мне делать с массивом $_SERVER? На сколько я знаю, его отдает серверная сторона. Каким образом он может быть подменен или в него может быть вставлена инъекция? Может быть NetBeans прав? и действительно нужна обработка. Если не от инъекций, то от чего-то другого? Прошу помощи опытных PHP-разработчиков, чтобы мне подробно разъяснили этот вопрос, дабы в дальнейшем или отключить эту подсказку или взять на вооружение новое знание.
  • Вопрос задан
  • 631 просмотр
Решения вопроса 2
delphinpro
@delphinpro Куратор тега PHP
frontend developer
Для начала, эта переменная никем не отдается. Ее формирует сам php.

Часть значений этого массива заполняется из пришедших http-заголовков. Как вы понимаете в некоторых заголовках специально можно прислать всё что угодно.
Ответ написан
Комментировать
index0h
@index0h
PHP, Golang. https://github.com/index0h
Я всегда в любых своих проектах использовал данные из массива $_SERVER напрямую.

Использовать глобальные переменные - плохая практика. С точки зрения безопасности, тестируемости и надежности вашего кода. На счет суперглобальных: один раз при инициализации вашего приложения вытягиваете нужные для вас данные из них, проверяете и вставляете в некий объект Request, это уже данные, которым вы можете доверять, посему изменять их внутри Request нельзя. Посмотрите symfony.com/doc/current/book/http_fundamentals.html

require_once $_SERVER['DOCUMENT_ROOT'].'/папка/файл.php'

Так писать по нельзя. От слова "совсем".
Используйте Composer. Подключение файлов вручную нужно только в точке входа (обычно это index.php). Опять же с точки зрения безопасности.
Никто вам не гарантирует, что $_SERVER['DOCUMENT_ROOT'] будет правильным, да и то, что будет создан такой элемент - тоже не гарантирует.

Исходя из этого возникает вопрос. На сколько это оправдано?

Со всей силы оправдано.

Но, что мне делать с массивом $_SERVER?

По возможности - забыть про его существование)). Исключения бывают конечно же, но редко.

Каким образом он может быть подменен или в него может быть вставлена инъекция?

$_SERVER['DOCUMENT_ROOT'] = '/dev/null';

require 'path/to/your/file.php';


Если запустить скрипт из консоли - куча элементов $_SERVER просто не будут созданы, например QUERY_STRING

Может быть NetBeans прав?

Прав

и действительно нужна обработка.

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

Рекомендую почитать: Попросили проверить код, на что смотреть нужно?
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@deshkovichR Автор вопроса
Я хочу развиваться как программист :)
Всем спасибо за ответы, я обязательно внимательно изучу все представленные ссылки. Всех с праздником Пасхи и с Днем трудящихся.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы