Безопасно ли использовать переключатель для определения метода 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. Этого достаточно?

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


person Community    schedule 29.09.2014    source источник


Ответы (2)


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

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

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

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

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

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

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

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

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

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

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

person Pedro Amaral Couto    schedule 30.09.2014
comment
Большое спасибо за подробный ответ, особенно за ссылку на более безопасный PHP-инг. - person ; 01.10.2014

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

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

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

person i alarmed alien    schedule 29.09.2014
comment
Спасибо. Большинство вопросов, которые я мог найти относительно очистки ввода в PHP, относятся к подготовленным операторам. Похоже, что нет однозначного ответа на ситуацию с санитарией (owasp.org/index.php/ XSS_Filter_Evasion_Cheat_Sheet) - person ; 29.09.2014