Полная очистка массива _POST

Я хочу полностью очистить содержимое массива $ _POST, все примеры, которые я вижу в Интернете, выглядят так:

if (count($_POST) > 0) {
    foreach ($_POST as $k=>$v) {
        unset($_POST[$k]);
    }
}

Скажите пожалуйста, этот вариант будет не лучше? (С точки зрения экономии ресурсов)

if (count($_POST) > 0) {
     $_POST = array();
}

или не ?


php
person Oto Shavadze    schedule 18.10.2012    source источник
comment
Зачем вам нужно опорожнять $_POST?   -  person rael_kid    schedule 18.10.2012
comment
Тебе даже не нужно count. $_POST = array(); и все готово.   -  person Mahn    schedule 18.10.2012
comment
После первого использования данных POST мне нужно очистить их   -  person Oto Shavadze    schedule 18.10.2012
comment
Если вам нужно изменить значения $_POST, вы делаете что-то не так.   -  person Jon    schedule 18.10.2012
comment
вам даже не нужно писать условие. простой $ _POST = array (); заявление сделаю.   -  person Rukmi Patel    schedule 18.10.2012
comment
@Jon, @Lex: $_POST доступен для записи, что отчасти глупо, имеет смысл очистить его, если вы используете интерфейс, такой как класс, для чтения пользовательского ввода.   -  person Wesley Murch    schedule 18.10.2012
comment
@WesleyMurch: Почему имеет смысл его очищать?   -  person Jon    schedule 18.10.2012
comment
Зачем вам вообще нужно очищать $_POST? В этом нет никакого смысла. Не размещайте ничего на следующей странице.   -  person Dorvalla    schedule 18.10.2012
comment
@Jon: Чтобы убедиться, что ваш интерфейс используется исключительно.   -  person Wesley Murch    schedule 18.10.2012
comment
@Wesley: Я думаю, вам все равно не стоит создавать класс, который напрямую использует $ _POST, так что ...   -  person rael_kid    schedule 18.10.2012
comment
@WesleyMurch: Для меня это звучит не очень убедительно. Если вы не хотите трогать $_POST, просто не делайте этого.   -  person Jon    schedule 18.10.2012
comment
У ОП могут быть и другие мотивы, но это реалистичный мотив, который я действительно использовал и, честно говоря, очень любил. Приятно быть уверенным в вещах, например, что данные POST не содержат XSS или ключи безопасны (класс может очистить его, а затем очистить данные сообщения, просто пример).   -  person Wesley Murch    schedule 18.10.2012
comment
Я также очищаю $_POST. Это вопрос инкапсуляции; очистка $_POST после его использования гарантирует, что никакая другая часть приложения не получит к нему доступ; в противном случае случайная ошибка в любом месте может раскрыть потенциально важные данные в $_POST.   -  person Mahn    schedule 18.10.2012
comment
Еще один интересный трюк - установить $ _POST вручную путем синтаксического анализа php://input, на случай, если, например, вы не хотите иметь дело с глупыми bracket[] именами полей, которые представляют собой массивы, и использовать повторяющиеся ключи ввода, как это может сделать остальная часть мира программирования, отличного от PHP. . В этом случае я бы просто очистил POST в качестве первого шага перед его повторным заполнением.   -  person Wesley Murch    schedule 18.10.2012
comment
Не забывайте, что POST данные также можно найти в $_REQUEST   -  person Josh J    schedule 10.09.2015
comment
Данные $ _POST также доступны через встроенные функции фильтрации, например: filter_input (INPUT_POST, 'var_int', FILTER_VALIDATE_INT) Даже после очистки массива $ _POST кодировщики могут получить доступ к вводу таким образом!   -  person Matthew Slyman    schedule 16.06.2017
comment
Я столкнулся с ситуацией, когда $ _POST должен быть пустым, но это не так. В DEV $ _POST, как и ожидалось, пуст. Но в PROD это не так. Понятия не имею, и выяснение того, как был поврежден $ _POST, займет слишком много времени. В этом случае я убеждаюсь, что $ _POST пуст.   -  person Nguai al    schedule 31.03.2020


Ответы (6)


Да это нормально. $_POST - это просто еще одна переменная, за исключением того, что она имеет (super) глобальную область действия.

$_POST = array();

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

person Wesley Murch    schedule 18.10.2012
comment
Технически он имеет суперглобальную область видимости, поскольку глобальная область видимости в PHP не является т. - person lonesomeday; 18.10.2012
comment
Похоже, у вас не связанная с этим проблема. Если вы прочитаете данные поста до того, как очистить его, будет уже слишком поздно. - person Wesley Murch; 30.01.2017
comment
Ах, я этого не знал и был удивлен, почему все проголосовали за, спасибо! - person NaturalBornCamper; 30.01.2017
comment
Это сбрасывает $ _POST, но вы все равно можете сделать это: filter_input (INPUT_POST, 'password', FILTER_UNSAFE_RAW) - и тому подобное. (В моей установке PHP на основе FastCGI этот метод возвращает фактические результаты, несмотря на то, что сначала была снята установка $ _POST!) Если это не делается по соображениям безопасности, я не могу понять законное приложение. - person Matthew Slyman; 16.06.2017
comment
еще короче $ _POST = []; - person clockw0rk; 21.07.2020

Чтобы отключить переменную $_POST, повторно объявите ее как пустой массив:

$_POST = array();
person rationalboss    schedule 18.10.2012
comment
Это сбрасывает $ _POST, но вы все равно можете сделать это: filter_input (INPUT_POST, 'password', FILTER_UNSAFE_RAW) - и тому подобное. (В моей установке PHP на основе FastCGI этот метод возвращает фактические результаты, несмотря на то, что сначала была снята установка $ _POST!) Если это не делается по соображениям безопасности, я не могу понять законное приложение. - person Matthew Slyman; 16.06.2017
comment
если вы хотите избежать повторной вставки, используйте атрибут действия, чтобы направить отправку формы на другую страницу и перенаправление заголовка using на эту конкретную страницу, тогда ваша повторная отправка в базу данных будет исправлена. @NaturalBornCamper - person Mr. Laeeq Khan; 21.02.2019
comment
@MatthewSlyman Теперь я беру свой первоначальный комментарий, когда понимаю, что вы имеете в виду. Да, вы можете фильтровать ввод и прочее, но OP не спрашивал, как игнорировать данные публикации. не могли бы вы показать нам ответ, чтобы предотвратить опасный filter_input? - person clockw0rk; 21.07.2020

Решения пока не работают, потому что данные POST хранятся в заголовках. Согласно этому сообщению, перенаправление решает эту проблему.

Как удалить $ Переменная _POST при нажатии кнопки "Обновить" в браузере с PHP?

person kiwicomb123    schedule 23.04.2018

Это может показаться слишком неудобным, но вам, вероятно, лучше отключать один элемент за раз, а не весь массив $ _POST. Вот почему: если вы используете объектно-ориентированное программирование, у вас может быть один класс, использующий $ _POST ['alpha'], а другой класс, использующий $ _POST ['beta'], и если вы отключите array после первого использования, он аннулирует его использование в других классах. Чтобы быть в безопасности и не выстрелить себе в ногу, просто примените небольшой метод, который отключит элементы, которые вы только что использовали: Например:

private function doUnset()
{
    unset($_POST['alpha']);
    unset($_POST['gamma']);
    unset($_POST['delta']);
    unset($_GET['eta']);
    unset($_GET['zeta']);
}

Просто вызовите метод и отключите только те суперглобальные элементы, которые были переданы переменной или аргументу. Затем другие классы, которым может потребоваться суперглобальный элемент, по-прежнему могут их использовать.

Однако разумно отключить суперглобальные переменные, как только они будут переданы инкапсулированному объекту.

person Bill    schedule 08.11.2015

Вы можете использовать сочетание unset() и инициализации:

unset($_POST);
$_POST = array();

Или в одном заявлении:

unset($_POST) ? $_POST = array() : $_POST = array();

Но по какой причине вы хотите это сделать?

person Praveen Kumar Purushothaman    schedule 18.10.2012
comment
@Mahn Те, кто использует функции фильтра PHP, не используют $ _POST для доступа к значениям формы. Таким образом, очистка $ _POST - это просто способ очистки ресурсов. Например, если кто-то сбрасывает в поле формы больше символов, чем разрешено (минуя все проверки на стороне клиента), и этот человек использует функции фильтра PHP, $ _POST - это то, что разработчик может захотеть очистить. У меня мой дезинфицирующий агент предварительно проверяет длину строки управления, а затем бросает и ловит RangeException, если в элементе управления больше символов, чем разрешено. Можно по-прежнему использовать $ _POST для подсчета отправленных элементов управления. - person Anthony Rutledge; 19.07.2015
comment
@AnthonyRutledge конечно, дело в том, что в этом сценарии вам не нужно оба unset и установить его в пустой массив. Достаточно просто выполнить последнее, чтобы его очистить. - person Mahn; 19.07.2015

Чтобы ответить на вопрос «почему» кто-то может его использовать, у меня возникло соблазн использовать его, поскольку у меня были значения $ _POST, сохраненные после обновления страницы или при переходе с одной страницы на другую. Мой разум подсказывает мне, что это не очень хорошая практика, но, тем не менее, она работает.

person 3xCh1_23    schedule 04.05.2014