Безопасно ли использовать переключатель для определения метода HTTP?

Я недавно прочитал учебник (http://code.tutsplus.com/tutorials/a-beginners-guide-to-http-and-rest—net-16340) при определении заголовков HTTP для изменения действия скрипта. В учебном пособии приведен пример сценария PHP для достижения этой цели.

$method = $_SERVER['REQUEST_METHOD'];

switch($method) {
case 'PUT':
$this->create_contact($name);
break;

case 'DELETE':
$this->delete_contact($name);
break;

case 'GET':
$this->display_contact($name);
break;

default:
header('HTTP/1.1 405 Method Not Allowed');
header('Allow: GET, PUT, DELETE');
break;
}

…и упоминает

Мы используем оператор switch, которого следует избегать в реальном
приложение:

Несколько вопросов:

  1. Почему бы вам не использовать эту функцию?
  2. Есть ли уязвимость в использовании самого оператора switch или переменная $ _SERVER делает его уязвимым?
  3. Ответ в этом посте (Является ли $ _SERVER [‘QUERY_STRING’] безопасным для XSS?) рекомендует использовать htmlentities для защиты значений $ _SERVER. Достаточно ли этого?

Спасибо большое!

0

Решение

Почему бы вам не использовать эту функцию?

Многие программисты выбирают свои причины, чтобы избежать использования операторов «switch», в зависимости от контекста.

Например, проект может иметь много операторы «switch» с дублированным кодом сделать что-то, что было бы решено с полиморфизмом.

«Переключатель» в данном случае используется для сопоставления методов HTTP с вызываемыми (кроме «по умолчанию»): вы можете сопоставить методы http с вызываемыми, которые можно заменить во время выполнения. Программисты Python, которые следуют «философии питона», используют словари для того же, что и операторы «switch», но с возможностью изменять карту во время выполнения.

Есть ли уязвимость в использовании самого оператора switch или
переменная $ _SERVER делает ее уязвимой?

Нет, уязвимостей в использовании «переключателя» нет.

Вы не должны бросать значения от $ _SERVER потому что они вводятся от веб-клиентов (обычно браузеров). Простой сценарий «curl» может отправлять неточные или недействительные данные, такие как IP-адрес, User-agent, реферер и т. Д. Это полезно для очистки веб-страниц (некоторые веб-сайты реализованы для предотвращения наивной очистки).

Проверить «filter_inputmsgstr «функция для фильтрации значений из глобальных переменных с входными значениями ($ _GET, $ _POST, $ _COOKIE, $ _SERVER, $ _ENV).

Ответ в этом сообщении (Безопасно ли $ _SERVER [‘QUERY_STRING’] от XSS?)
рекомендует использовать htmlentities для защиты значений $ _SERVER. Это
достаточно?

Это зависит от контекста.

Например, если вы хотите использовать его для кода JavaScript, этого будет недостаточно для защиты от XSS. В этом случае вам нужно использовать функцию для экранирования строк для javascript (в этом случае может быть полезен «json_encode»).

2

Другие решения

Чтобы ответить на ваш switch вопрос, причина того, что потенциально не использовать его в приложении, заключается в том, что это медленнее, чем использование if / else if / else — Есть несколько тестов доступны на PHP Bench которые демонстрируют это. Разница в производительности switch против if/else вероятно, будет незначительным по сравнению со временем, затраченным на отправку запросов и ответов по сети.

Некоторые программисты считают, что switch конструкции менее разборчивы, чем if/else — это зависит от личного вкуса. В использовании нет ничего «небезопасного» switch,

Существует ряд существующих вопросов SO, которые охватывают очистку ввода в PHP, поэтому я предлагаю вам ознакомиться с ними. Например. Защищают ли мой PHP-код от внедрения htmlspecialchars и mysql_real_escape_string? а также Каков наилучший метод для дезинфекции ввода пользователя с помощью PHP?

0

По вопросам рекламы [email protected]