Поиск…


замечания

Выбор между GET и POST

GET , лучше всего предоставлять данные, необходимые для отображения страницы, и их можно использовать несколько раз (поисковые запросы, фильтры данных ...). Они являются частью URL-адреса, что означает, что они могут быть добавлены в закладки и часто используются повторно.

Запросы POST, с другой стороны, предназначены для отправки данных на сервер только один раз (контактные формы, формы входа ...). В отличие от GET, который принимает только ASCII, запросы POST также позволяют бинарные данные, включая загрузку файлов .

Вы можете найти более подробное объяснение их различий здесь .

Уязвимость данных запроса

Также посмотрите: какие уязвимости используются при прямом использовании GET и POST?

Получение данных из суперглобальных переменных $ _GET и $ _POST без какой-либо проверки считается плохой практикой и открывает методы для пользователей для потенциального доступа или компрометации данных с помощью инъекций кода и SQL . Неверные данные должны быть проверены и отклонены, чтобы предотвратить такие атаки.

Данные запроса должны быть экранированы в зависимости от того, как они используются в коде, как указано здесь и здесь . В этом ответе можно найти несколько различных функций эвакуации для общих случаев использования данных.

Обработка ошибок загрузки файлов

$_FILES["FILE_NAME"]['error'] (где "FILE_NAME" - это значение атрибута имени входного файла, представленного в вашей форме) может содержать одно из следующих значений:

  1. UPLOAD_ERR_OK - Нет ошибки, файл загружен с успехом.
  2. UPLOAD_ERR_INI_SIZE - Загруженный файл превышает директиву upload_max_filesize в php.ini .
  3. UPLOAD_ERR_PARTIAL - загруженный файл превышает директиву MAX_FILE_SIZE, указанную в HTML-форме.
  4. UPLOAD_ERR_NO_FILE - файл не загружен.
  5. UPLOAD_ERR_NO_TMP_DIR - Отсутствует временная папка. (Из PHP 5.0.3).
  6. UPLOAD_ERR_CANT_WRITE - Не удалось записать файл на диск. (Из PHP 5.1.0).
  7. UPLOAD_ERR_EXTENSION - расширение PHP остановило загрузку файла. (Из PHP 5.2.0).

Основным способом проверки ошибок является следующее:

<?php
$fileError = $_FILES["FILE_NAME"]["error"]; // where FILE_NAME is the name attribute of the file input in your form
switch($fileError) {
    case UPLOAD_ERR_INI_SIZE:
        // Exceeds max size in php.ini
        break;
    case UPLOAD_ERR_PARTIAL:
        // Exceeds max size in html form
        break;
    case UPLOAD_ERR_NO_FILE:
        // No file was uploaded
        break;
    case UPLOAD_ERR_NO_TMP_DIR:
        // No /tmp dir to write to
        break;
    case UPLOAD_ERR_CANT_WRITE:
        // Error writing to disk
        break;
    default:
        // No error was faced! Phew!
        break;
}

Чтение данных 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";
7,0
$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";
7,0
$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);
5,6

$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-код вы тогда сделаете что-то вроде этого:

<?php
/* PUT data comes in on the stdin stream */
$putdata = fopen("php://input", "r");

/* Open a file for writing */
$fp = fopen("putfile.ext", "w");

/* Read the data 1 KB at a time
   and write to the file */
while ($data = fread($putdata, 1024))
  fwrite($fp, $data);

/* Close the streams */
fclose($fp);
fclose($putdata);
?>

Также здесь вы можете прочитать интересные вопросы и ответы о получении файла через HTTP PUT.

Передача массивов POST

Обычно элемент HTML-формы, представленный в PHP, приводит к одному значению. Например:

<pre>
<?php print_r($_POST);?>
</pre>
<form method="post">
    <input type="hidden" name="foo" value="bar"/>
    <button type="submit">Submit</button>
</form>

Это приводит к следующему результату:

Array
(
    [foo] => bar
)

Однако могут быть случаи, когда вы хотите передать массив значений. Это можно сделать, добавив PHP-подобный суффикс к имени HTML-элементов:

<pre>
<?php print_r($_POST);?>
</pre>
<form method="post">
    <input type="hidden" name="foo[]" value="bar"/>
    <input type="hidden" name="foo[]" value="baz"/>
    <button type="submit">Submit</button>
</form>

Это приводит к следующему результату:

Array
(
    [foo] => Array
        (
            [0] => bar
            [1] => baz
        )

)

Вы также можете указать индексы массива в виде чисел или строк:

<pre>
<?php print_r($_POST);?>
</pre>
<form method="post">
    <input type="hidden" name="foo[42]" value="bar"/>
    <input type="hidden" name="foo[foo]" value="baz"/>
    <button type="submit">Submit</button>
</form>

Что возвращает этот вывод:

Array
(
    [foo] => Array
        (
            [42] => bar
            [foo] => baz
        )

)

Этот метод можно использовать, чтобы избежать циклов обработки после массива $_POST , делая ваш код более компактным и более кратким.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow