@Bjornie
Изучаю Python

Какой классический формат приема и обработки данных с формы?

К примеру скрипт обрабатывает форму, передающую данные разных типов из нескольких полей методом post, которые надо проверить, отфильтровать, и безопасно занести в базу.

Каким является универсальный шаблон для таких процедур? Т.к. как я это вижу:
if (isset($_POST[])) { // Проверяем пришли ли какие-то данные через POST
  if (isset($_POST['name'])) { // делаем какую-нибудь проверку на установленную переменную
    $name = htmlspecialchars($_POST['name']); // при необходимости также trim, real_escape_string
    $surname = htmlspecialchars($_POST['surname']); // при необходимости также trim, real_escape_string
    $query; // пишем запрос, используя подготовленные запросы (pdo или mysqli)
    // выполняем запрос в БД
    // получаем ответ от БД
    // обрабатываем ответ (success/fal) и реагируем
    $db->close(); // закрываем соединение
  }
}

Является ли это корректным вариантом приемом данных? Что я забыл?

1) Что если поступает много строк, нужно ли каждую обрабатывать вручную или для нее есть специальные фильтрующие функции, которые делают всё сразу?
2) Стоит ли делать какие-то дополнительные проверки по-умолчанию всегда?
3) Каким в идеале должен быть блок else (если запрос не POST), die()? Редирект? Что-то другое?

Спасибо.
  • Вопрос задан
  • 127 просмотров
Пригласить эксперта
Ответы на вопрос 3
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
1. Проверка всех входных и выходных данных - только Regexp по "белому" списку.
Иначе говоря - принимаем только ожидаемые значения.
preg_match();
Используем те же правила проверки (js+regex) на клиентской стороне сайта (в браузере) перед отправкой данных на сервер.

2. Закрываем соединение с базой только тогда, когда оно уже более не нужно для текущего исполнения PHP-скрипта до конца его работы. обычно, соединение к базе закрывается перед началом формирования страницы по шаблону. Можно закрывать ещё точнее: после завершения работы последнего запроса из последнего модуля списка всех модулей, участвующих в работе с данными в базе.

И на последок маленькая, но ОЧЕНЬ! полезная функция собственного производства:
function validfilter($value,$regexp,$flags='usi') {
  if (preg_match('/'.$regexp.'/'.$flags, $value,$result) && $result[0]===$value) 
     return $value;  
  else return false;
}
Ответ написан
Комментировать
1. ну как вариант - filter_var_array; имена лучше прогонять по белому списку, выше про это уже писали, но это уже от проекта зависит;

2. в приступах паранойи, я иногда заворачиваю все в base64 перед сохранением куда-либо; структурированные данные - json_encode + base64_encode. избыточно ли это? наверное, да ))

3. эмм.. а что бы вы хотели, чтобы происходило? ))
Ответ написан
@Arik
Надо сохранять в БД так как прислал пользователь, если его данные прошли валидаторы! Нельзя что-то менять, пользователь не это прислал, и такая попа будет чтоб вернуть ему то что он до этого прислал. Менять можно, например, пароль хранить в виде хэша или эл.почту в нижний регистре, можно поправить тип данных (POST всегда в виде строки, а вам надо целое число или булеан), если БД noSQL типа. htmlspecialchars актуален для html страниц, а если вам надо будет отправить данные мобильному приложению, что мобильное приложение будет делать с & l t ; и т.д.? Получается вам надо только писать валидаторы, чтоб в БД не было мусора и экранировать кавычки чтоб не было SQL-инъекций. А вот когда показываете, тогда уже надо думать что безопасно показывать, а что надо экранировать чтоб не было XSS-инъекций и т.д.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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