Я недавно прочитал учебник (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, которого следует избегать в реальном
приложение:
Несколько вопросов:
Спасибо большое!
Почему бы вам не использовать эту функцию?
Многие программисты выбирают свои причины, чтобы избежать использования операторов «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»).
Чтобы ответить на ваш switch
вопрос, причина того, что потенциально не использовать его в приложении, заключается в том, что это медленнее, чем использование if
/ else if
/ else
— Есть несколько тестов доступны на PHP Bench которые демонстрируют это. Разница в производительности switch
против if/else
вероятно, будет незначительным по сравнению со временем, затраченным на отправку запросов и ответов по сети.
Некоторые программисты считают, что switch
конструкции менее разборчивы, чем if/else
— это зависит от личного вкуса. В использовании нет ничего «небезопасного» switch
,
Существует ряд существующих вопросов SO, которые охватывают очистку ввода в PHP, поэтому я предлагаю вам ознакомиться с ними. Например. Защищают ли мой PHP-код от внедрения htmlspecialchars и mysql_real_escape_string? а также Каков наилучший метод для дезинфекции ввода пользователя с помощью PHP?