- PHP Чтение данных запроса
- Уязвимость данных запроса
- Обработка ошибок загрузки файлов
- Чтение данных POST
- Чтение данных GET
- Чтение исходных данных POST
- Загрузка файлов с помощью HTTP PUT
- Передача массивов POST
- Как распечатать все результаты POST при отправке формы?
- Как распечатать всю информацию из HTTP-запроса на экране, в PHP
PHP
Чтение данных запроса
GET , лучше всего предоставлять данные, необходимые для отображения страницы, и их можно использовать несколько раз (поисковые запросы, фильтры данных . ). Они являются частью URL-адреса, что означает, что они могут быть добавлены в закладки и часто используются повторно.
Запросы POST, с другой стороны, предназначены для отправки данных на сервер только один раз (контактные формы, формы входа . ). В отличие от GET, который принимает только ASCII, запросы POST также позволяют бинарные данные, включая загрузку файлов .
Вы можете найти более подробное объяснение их различий здесь .
Уязвимость данных запроса
Получение данных из суперглобальных переменных $ _GET и $ _POST без какой-либо проверки считается плохой практикой и открывает методы для пользователей для потенциального доступа или компрометации данных с помощью инъекций кода и SQL . Неверные данные должны быть проверены и отклонены, чтобы предотвратить такие атаки.
Данные запроса должны быть экранированы в зависимости от того, как они используются в коде, как указано здесь и здесь . В этом ответе можно найти несколько различных функций эвакуации для общих случаев использования данных.
Обработка ошибок загрузки файлов
$_FILES[«FILE_NAME»][‘error’] (где «FILE_NAME» — это значение атрибута имени входного файла, представленного в вашей форме) может содержать одно из следующих значений:
- UPLOAD_ERR_OK — Нет ошибки, файл загружен с успехом.
- UPLOAD_ERR_INI_SIZE — Загруженный файл превышает директиву upload_max_filesize в php.ini .
- UPLOAD_ERR_PARTIAL — загруженный файл превышает директиву MAX_FILE_SIZE, указанную в HTML-форме.
- UPLOAD_ERR_NO_FILE — файл не загружен.
- UPLOAD_ERR_NO_TMP_DIR — Отсутствует временная папка. (Из PHP 5.0.3).
- UPLOAD_ERR_CANT_WRITE — Не удалось записать файл на диск. (Из PHP 5.1.0).
- UPLOAD_ERR_EXTENSION — расширение PHP остановило загрузку файла. (Из PHP 5.2.0).
Основным способом проверки ошибок является следующее:
Чтение данных POST
Данные из запроса POST хранятся в суперглобальном $_POST в форме ассоциативного массива.
Обратите внимание, что доступ к несуществующему элементу массива генерирует уведомление, поэтому существование всегда следует проверять с помощью функций isset() или empty() или оператора null coalesce.
$from = isset($_POST["name"]) ? $_POST["name"] : "NO NAME"; $message = isset($_POST["message"]) ? $_POST["message"] : "NO MESSAGE"; echo "Message from $from: $message";
$from = $_POST["name"] ?? "NO NAME"; $message = $_POST["message"] ?? "NO MESSAGE"; echo "Message from $from: $message";
Чтение данных GET
Данные из запроса GET хранятся в суперглобальном $_GET в форме ассоциативного массива.
Обратите внимание, что доступ к несуществующему элементу массива генерирует уведомление, поэтому существование всегда следует проверять с помощью функций isset() или empty() или оператора null coalesce.
Пример: (для URL /topics.php?author=alice&topic=php )
$author = isset($_GET["author"]) ? $_GET["author"] : "NO AUTHOR"; $topic = isset($_GET["topic"]) ? $_GET["topic"] : "NO TOPIC"; echo "Showing posts from $author about $topic";
$author = $_GET["author"] ?? "NO AUTHOR"; $topic = $_GET["topic"] ?? "NO TOPIC"; echo "Showing posts from $author about $topic";
Чтение исходных данных POST
Обычно данные, отправленные в запросе POST, представляют собой структурированные пары ключ / значение с типом MIME- application/x-www-form-urlencoded . Однако для многих приложений, таких как веб-сервисы, вместо них необходимо отправить необработанные данные, часто в формате XML или JSON. Эти данные могут быть прочитаны с использованием одного из двух методов.
php://input — это поток, который обеспечивает доступ к необработанному тексту запроса.
$rawdata = file_get_contents("php://input"); // Let's say we got JSON $decoded = json_decode($rawdata);
$HTTP_RAW_POST_DATA — это глобальная переменная, содержащая необработанные данные POST. Он доступен только в том случае, если always_populate_raw_post_data директива always_populate_raw_post_data в php.ini .
$rawdata = $HTTP_RAW_POST_DATA; // Or maybe we get XML $decoded = simplexml_load_string($rawdata);
Эта переменная устарела с PHP версии 5.6 и была удалена в PHP 7.0.
Обратите внимание, что ни один из этих методов не доступен, если для типа содержимого задано значение multipart/form-data , которое используется для загрузки файлов.
Загрузка файлов с помощью HTTP PUT
PHP обеспечивает поддержку метода HTTP PUT, используемого некоторыми клиентами для хранения файлов на сервере. Запросы PUT намного проще, чем загрузка файлов с использованием запросов POST, и они выглядят примерно так:
PUT /path/filename.html HTTP/1.1
В ваш PHP-код вы тогда сделаете что-то вроде этого:
Также здесь вы можете прочитать интересные вопросы и ответы о получении файла через HTTP PUT.
Передача массивов POST
Обычно элемент HTML-формы, представленный в PHP, приводит к одному значению. Например:
Это приводит к следующему результату:
Однако могут быть случаи, когда вы хотите передать массив значений. Это можно сделать, добавив PHP-подобный суффикс к имени HTML-элементов:
Это приводит к следующему результату:
Array ( [foo] => Array ( [0] => bar [1] => baz ) )
Вы также можете указать индексы массива в виде чисел или строк:
Что возвращает этот вывод:
Array ( [foo] => Array ( [42] => bar [foo] => baz ) )
Этот метод можно использовать, чтобы избежать циклов обработки после массива $_POST , делая ваш код более компактным и более кратким.
- Начало работы с PHP
- APCu
- BC Math (бинарный калькулятор)
- Imagick
- IMAP
- JSON
- Loops
- PDO
- PHP MySQLi
- php mysqli affected rows возвращает 0, когда он должен возвращать положительное целое число
- PHP Встроенный сервер
- PHPDoc
- PSR
- SimpleXML
- SQLite3
- Streams
- URL-адрес
- UTF-8,
- WebSockets
- XML
- YAML в PHP
- Автозагрузка грунтовки
- Альтернативный синтаксис для структур управления
- Анализ HTML
- Асинхронное программирование
- Аутентификация HTTP
- Безопасность
- Буферизация вывода
- Вклад в PHP Core
- Внедрение зависимости
- Внесение изменений в Руководство по PHP
- Волшебные константы
- Волшебные методы
- Вывод значения переменной
- Выполнение по массиву
- Генераторы
- закрытие
- Защитите Remeber Me
- Интерфейс командной строки (CLI)
- Использование cURL в PHP
- Использование MongoDB
- Использование Redis с PHP
- Использование SQLSRV
- Итерация массива
- Как определить IP-адрес клиента
- Как разбить URL-адрес
- Класс Datetime
- Классы и объекты
- Клиент SOAP
- Комментарии
- Компилировать расширения PHP
- Компиляция ошибок и предупреждений
- Константы
- Контрольные структуры
- криптография
- кэш
- локализация
- Манипулирование массивом
- Манипуляции заголовков
- Массивы
- Машинное обучение
- Менеджер зависимостей композитора
- Многопоточное расширение
- многопроцессорная обработка
- Монго-PHP
- Область переменных
- Обработка изображений с помощью GD
- Обработка исключений и отчетов об ошибках
- Обработка нескольких массивов вместе
- Обработка файлов
- Общие ошибки
- операторы
- отладка
- Отправка электронной почты
- отражение
- переменные
- Переменные Superglobal PHP
- Печенье
- Поддержка Unicode в PHP
- Пространства имен
- Работа с датами и временем
- Развертывание докеров
- Регулярные выражения (regexp / PCRE)
- Рекомендации
- Рецепты
- Розетки
- Сервер SOAP
- Сериализация
- Сериализация объектов
- сессии
- Соглашения о кодировании
- Создание PDF-файлов в PHP
- Спектакль
- Строковый анализ
- Структуры данных SPL
- Тестирование устройства
- Тип жонглирования и нерегулярные проблемы сравнения
- Тип подсказки
- Типы
- Установка в средах Linux / Unix
- Установка среды PHP в Windows
- Фильтры и функции фильтра
- Форматирование строк
- функции
- Функции хеширования пароля
- Функциональное программирование
- Черты
- Чтение данных запроса
- Шаблоны проектирования
Как распечатать все результаты POST при отправке формы?
Мне нужно увидеть все результаты POST , которые отправляются на сервер для тестирования.
Каким будет пример того, как я могу создать новый файл для отправки на него, будут отображаться все поля, которые были отправлены с этой формой?
Он динамический, поэтому некоторые поля могут иметь имя / идентификатор field1, field2, field3 и т. Д.
Все значения хранятся в коллекции $_POST
или если вы хотите что-то более интересное, которое легче читать, используйте цикл foreach для циклического $_POST коллекции $_POST и печати значений.
$value) < echo ""; echo ""; echo $key; echo " "; echo ""; echo $value; echo " "; echo " "; > ?>
Вы можете попробовать var_dump :
Вы можете использовать что-то простое, как это
Это сделало бы его более доступным:
Вы можете определенно использовать var_dump , но вы упомянули, что находитесь в разработке интерфейса. Я уверен, что вы это знаете, но как раз напоминание, используйте Firefox Firebug или инструмент разработчика Chrome / Internet Explorer и проверьте почту. Сообщение проходит через слушателей, и вы также сможете проверить его там.
Вы можете иметь в виду что-то вроде этого:
if (! function_exists('d')) < // Debugger function d($var, $exit = 0) < // Only output on localhost if ($_SERVER['HTTP_HOST'] != 'localhost') < return; >echo "\n[degug_output_BEGIN]
\n"; echo var_export($var, 1); echo "\n[degug_output_END]\n"; if ($exit) exit; > > // Call: d($_POST);Бонус: проверьте, что debug_backtrace () также добавляет трассировку в вашу отладку.
Как распечатать всю информацию из HTTP-запроса на экране, в PHP
Мне нужен PHP-код, который делает дамп всей информации в HTTP-запросе, включая заголовки и содержимое любой информации, включенной в запрос POST. В принципе, диагностический инструмент, который выплескивает именно то, что я отправляю на сервер.
У кого-нибудь есть код, который это делает?
Это касается большинства входящих элементов: PHP.net Manual: $ _REQUEST
Требуется немного массирования, чтобы получить все в том порядке, в котором вы хотите, и исключить переменные, которые вам не интересны, но вы должны начать.
Ну, вы можете прочитать все тело POST, как это
echo file_get_contents( 'php://input' );
И, предполагая, что ваш веб-сервер Apache, вы можете читать заголовки запросов так
$requestHeaders = apache_request_headers();
Никто не упоминал, как правильно сбрасывать заголовки HTTP при любых обстоятельствах.
Из спецификации CGI rfc3875, раздел 4.1.18:
Мета-переменные с именами, начинающимися с «HTTP_», содержат значения, считанные из полей заголовка запроса клиента, если используется протокол HTTP. Имя поля заголовка HTTP преобразуется в верхний регистр, все вхождения «-» заменены на « » и имеет «HTTP », чтобы присвоить имя мета-переменной.
foreach ($_SERVER as $key => $value) < if (strpos($key, 'HTTP_') === 0) < $chunks = explode('_', $key); $header = ''; for ($i = 1; $y = sizeof($chunks) - 1, $i < $y; $i++) < $header .= ucfirst(strtolower($chunks[$i])).'-'; >$header .= ucfirst(strtolower($chunks[$i])).': '.$value; echo $header.'
'; > >Объединив ответы от Питера Бейли и Cmyker, вы получите что-то вроде:
$value) < if (strpos($key, 'HTTP_') === 0) < $chunks = explode('_', $key); $header = ''; for ($i = 1; $y = sizeof($chunks) - 1, $i < $y; $i++) < $header .= ucfirst(strtolower($chunks[$i])).'-'; >$header .= ucfirst(strtolower($chunks[$i])).': '.$value; echo $header."\n"; > > $body = file_get_contents('php://input'); if ($body != '') < print("\n$body\n\n"); >?>
который работает с встроенным веб-сервером php -S , что является весьма удобной функцией PHP.
Если вам нужны фактические заголовки HTTP (как запрос, так и ответ), дайте hurl.it попытку.
Вы можете использовать команду apache_request_headers() PHP, чтобы получить заголовки запросов и apache_response_headers() чтобы получить текущие заголовки ответов. Обратите внимание, что ответ может быть изменен позже в скрипте PHP, пока контент не был отправлен.
file_get_contents (‘php: // input’) не всегда будет работать.
У меня есть запрос с заголовками «content-length = 735», а «php: // input» – пустая строка. Это зависит от того, насколько хорош / действителен HTTP-запрос.
Кроме того, вы можете использовать get_headers () . это не зависит от apache ..