Intereting Posts
Получение информации о пользователе Google-PHP-Client? Несколько запросов, использующих orWhere, в полях модели и связанных моделей mysql_select_db () ожидает, что параметр 2 будет ресурсом, объект указан Установка mikehaertl-phpwkhtmltopdf на xampp – для чайников Композитный образец и инъекция зависимостей Как получить подмножество массива $ _POST с ключами, начинающимися с префикса копирование на временную таблицу занимает много времени Как уничтожить сеанс php с помощью одной кнопки PHP Неустранимая ошибка: вызов функции-члена fetch_array () в boolean `Lexik_jwt_authentication.on_jwt_created` отсутствует в профилировщике Symfony Как динамически создавать новое свойство Начальная перезагрузка сервера на Ajax-вызов Laravel-5 эквивалент «LIKE» («Красноречивый») Как расширить HTTP-сервер C ++ с помощью приложений FastCGI? Сериализованные данные в базе данных mysql должны объединяться в массив

Является ли $ _SERVER гарантированным заглавное?

В настоящее время у меня есть strtoupper($_SERVER['REQUEST_METHOD']) в моем коде.

Но нужен ли strtoupper ? Является ли $_SERVER['REQUEST_METHOD'] гарантированным заглавными буквами?

Solutions Collecting From Web of "Является ли $ _SERVER гарантированным заглавное?"

RFC 3875 определяет переменную REQUEST_METHOD как верхний регистр, поэтому на это можно положиться.

Мета-переменная REQUEST_METHOD ДОЛЖНА быть установлена ​​на метод, который должен использоваться скриптом для обработки запроса …

  REQUEST_METHOD = method method = "GET" | "POST" | "HEAD" | extension-method extension-method = "PUT" | "DELETE" | token 

Метод чувствителен к регистру.

Короткий ответ: нет, это не гарантировано, но, как правило, получение HTTP-метода, отличного от верхнего, означает, что клиент нарушил спецификацию.

Длительный ответ:

Если вы имеете дело с методами, определенными спецификациями W3, такими как GET и POST, вам гарантируется, что клиент, отвечающий спецификации , отправит вам их в верхнем регистре. Это связано с тем, что методы HTTP определяются как чувствительные к регистру …

Маркер метода указывает способ, который должен выполняться на ресурсе, идентифицированном Request-URI. Метод чувствителен к регистру.

и W3-определенные методы, такие как OPTIONS, GET, POST и т. д. , определены в верхнем регистре.

Однако, если вы имеете дело с клиентом, не совместимым со спецификацией, ни ваш веб-сервер, ни PHP не будут магически принуждать значение $_SERVER['REQUEST_METHOD'] к заглавному для вас. Это можно легко продемонстрировать с помощью простого сценария, подобного этому …

 <?php echo "The method used by your request was $_SERVER[REQUEST_METHOD]"; ?> 

Если мы нажмем этот скрипт с HTTP-запросом, метод которого не является прописным, он будет отсылать метод в прописном. Множество общих инструментов позволит нам это сделать. Например, давайте удалим его из оболочки UNIX:

 $ curl http://localhost/echo_method.php -X GET -w "\n" The method used by your request was GET $ curl http://localhost/echo_method.php -X gEt -w "\n" The method used by your request was gEt $ curl http://localhost/echo_method.php -X fWoRbLeWoRbLe -w "\n" The method used by your request was fWoRbLeWoRbLe 

… или используя Python:

 >>> import httplib >>> connection = httplib.HTTPConnection('localhost') >>> connection.request('pOsT', '/echo_method.php') >>> connection.getresponse().read() 'The method used by your request was pOsT' 

«Хорошо» , можно сказать, «так что есть потенциальные проблемы, если мой API используется плохо написанными сценариями или родными приложениями. Но мой API используется только для вызовов AJAX, вызванных JavaScript, запущенных в веб-браузере. вопрос влияет на меня? "

К сожалению, да. Похоже, что современные браузеры принуждают большинство стандартных HTTP-методов заглавными при отправке AJAX, но в настоящее время этого не делают для пользовательских методов HTTP или, в частности, метода PATCH .

Нажав тот же PHP-скрипт с этого момента, на этот раз на консоли Chrome JavaScript …

 var request; request = new XMLHttpRequest(); request.open("GeT", "http://localhost/echo_method.php", true); request.send(); request.onreadystatechange = function() { if (request.readyState == 4) { console.log(request.responseText); } } 

дает результат

 The method used by your request was GET 

но изменение метода HTTP на pATcH дает нам

 var request; request = new XMLHttpRequest(); request.open("pATcH", "http://localhost/echo_method.php", true); request.send(); request.onreadystatechange = function() { if (request.readyState == 4) { console.log(request.responseText); } } 

дает нам

 The method used by your request was pATcH 

Хуже того, веб-браузеры не являются единственными клиентами, которые будут принуждать все методы, кроме метода PATCH, в верхний регистр.

В заключение: в то время как спецификация HTTP требует, чтобы запросы включали HTTP-метод в верхнем регистре (если это не особый метод, специально определенный в другом случае), обычные веб-инструменты делают его достаточно простым для разработчиков, чтобы получить это неправильно, а PHP $_SERVER['REQUEST_METHOD'] Переменная $_SERVER['REQUEST_METHOD'] не будет магически принудительно использовать метод в верхнем регистре для вас, если они это сделают.

Разумеется, зависит от того, хотите ли вы полагаться на своих клиентов, соблюдающих спецификацию, подтвердите, что метод имеет верхний регистр и отвечает соответствующим кодом состояния (возможно, 400 или 405) и сообщением об ошибке, если это не так, или принять неверно (HTTP-методы), путем принудительного ввода метода в верхний регистр через strtoupper($_SERVER['REQUEST_METHOD']) как и здесь, здесь задавался вопрос.

Это полностью зависит от SAPI, и насколько я знаю, в PHP-спецификации нет ничего, что заставило бы заглавное имя метода. Вот фрагмент кода из AOL Server SAPI:

 Ns_RegisterRequest(ctx->ns_server, "POST", value, php_ns_request_handler, NULL, ctx, 0); 

Если кто-то изменит этот post в post это будет строчный.

Один вызов strtoupper() стоит вам абсолютно ничего, поэтому не рискуйте и просто используйте его.

Да, это то, что PHP внутренне ищет под php 5.4

http://lxr.php.net/opengrok/xref/PHP_5_4/main/SAPI.c#456

 454 if (SG(server_context)) { 455 if (PG(enable_post_data_reading) && SG(request_info).request_method) { 456 if (SG(request_info).content_type && !strcmp(SG(request_info).request_method, "POST")) { 

http://lxr.php.net/opengrok/xref/PHP_5_4/main/SAPI.c#797

 796 } else if (SG(request_info).proto_num > 1000 && 797 SG(request_info).request_method && 798 strcmp(SG(request_info).request_method, "HEAD") && 799 strcmp(SG(request_info).request_method, "GET")) { 

Он передает эти значения с сервера, но если он не соответствует спецификации для передачи данных, это плохо управляющий сервер … но HTTP RFC говорит только о верхнем регистре. Поэтому на самом деле это не проблема.

Из-за этого гарантируется верхний случай.

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

Документация php, по- видимому, указывает на то, что для этой переменной существует четыре возможных значения: GET, HEAD, POST или PUT, все из которых имеют верхний регистр. Вы всегда можете сделать strcasecmp вместо сравнения ==.