Адекватная ли фильтрация POST данных?

public static function post(Array $post) {

       $cleaned = [];

       foreach ($post as $key => $value) {

           $cleaned[] = filter_input(INPUT_POST, $key, FILTER_SANITIZE_FULL_SPECIAL_CHARS);

       }

        return $cleaned;

    }


или хрень написал?
  • Вопрос задан
  • 1229 просмотров
Решения вопроса 2
trevoga_su
@trevoga_su
хрень
вот так надо:
/**
     * Очищает массив от пробелов и слэшей.
     *
     * @param array
     * @return array
     */
    private static function clearData(&$in)
    {
        if ($in && is_array($in)) {
            foreach ($in as $key => $value) {
                if (is_array($value)) {
                    self::clearData($in[$key]);
                } else {
                    $value = trim($value);

                    if (get_magic_quotes_gpc()) {
                        $value = stripslashes($value);
                    }

                    $in[$key] = $value;
                }
            }
        }

        return $in;
    }

т.е. приходимся рекурсивно по POST (и GET и REQUEST кстати тоже надо) и чистим от пробелов и, если у вас версия php с магическими кавычками, то от возможных слэшей.

далее, одна из частых ошибок новичков - обрабатывать данные через htmlspecialchars() или её эквивалент как у тебя. хз где этому учат, вероятно есть какая-то секта, не иначе.

ЗАПОМНИТЕ РАЗ И НАВСЕГДА - htmlspecialchars нужен ТОЛЬКО при выводе данных в шаблон. htmlspecialchars нужен что бы символы, являющиеся частью языка HTML преобразовывать в мнемоники, т.е. в эквиваленты, что бы верстка не поехала, когда в ваших данных встретятся символы <>" и '

в базу надо ВСЕГДА записывать данные как есть - что пришло, то и записываем.
Ответ написан
index0h
@index0h
PHP, Golang. https://github.com/index0h
ну, эта ваша защита от ничего))

<?php

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

class InvalidRequestParam extends \InvalidArgumentException
{}

class MyController
{
    /**
     * @param Request $request
     * @return Response
     */
    public function myAction(Request $request)
    {
        try {
            $intPostParam          = $request->request->get('intPostParam');
            $unsignedIntPostParam  = $request->request->get('unsignedIntPostParam');
            $md5GetParam           = $request->query->get('md5GetParam');
            $optionalDigitGetParam = $request->query->get('optionalDigitGetParam');

            if (is_null($intPostParam)) {
                throw new InvalidRequestParam('"intPostParam" is required');
            } elseif (!is_numeric($intPostParam)) {
                throw new InvalidRequestParam('"intPostParam" must be numeric');
            }

            if (is_null($unsignedIntPostParam)) {
                throw new InvalidRequestParam('"unsignedIntPostParam" is required');
            } elseif (!ctype_digit($unsignedIntPostParam)) {
                throw new InvalidRequestParam('"unsignedIntPostParam" must be digit');
            }

            if (is_null($md5GetParam)) {
                throw new InvalidRequestParam('"md5GetParam" is required');
            } elseif (!preg_match('/^[\da-f]{32}$/', $md5GetParam)) {
                throw new InvalidRequestParam('"md5GetParam" must be correct md5 hash');
            }

            if (!is_null($optionalDigitGetParam) && !ctype_digit($optionalDigitGetParam)) {
                throw new InvalidRequestParam('"optionalDigitGetParam" must be digit or null');
            }

            // Тут ваша бизнес логика

            return new Response('All params correct');
        } catch (InvalidRequestParam $e) {
            return new Response($e->getMessage(), Response::HTTP_BAD_REQUEST);
        } catch (\Throwable $e) {
            return new Response('Some thing went wrong', Response::HTTP_INTERNAL_SERVER_ERROR);
        }
    }
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы