#php #html #wordpress #forms
#php #HTML #wordpress #формы
Вопрос:
Фон
HTML-форма, например, для пользователя, отправляющего свои бизнес-данные, которые позже появятся в юридическом документе — поэтому данные должны быть точными.
Отправляется PHP-скрипту, который проверяет все входные данные.
Если все входные данные действительны, данные очищаются и записываются в базу данных с использованием параметризованных запросов.
Если какой-либо из входных данных неверен, он повторно отображает форму. Мне кажется, что пользователь ожидает, что эта форма будет заполнена тем, что он первоначально ввел, с некоторой обратной связью о том, что не так с их вводом. Затем они могут изменить свои входные данные и повторно отправить форму. Это означает, что форма должна быть заполнена неочищенными данными (они будут экранированы перед их отображением).
Пока все хорошо.
Проблема
Если данные действительны, они записываются в базу данных. Наилучшей практикой, по-видимому, является очистка данных перед отправкой их в базу данных.
Это означает, что данные, записанные в базу данных, могут быть не совсем такими, какие ввел пользователь (например, если очистка удаляет некоторые «опасные» символы).
Мне кажется, что это плохой пользовательский интерфейс.
Я использую PHP, и код выполняется в рамках WordPress. WP имеет свои собственные функции очистки, и они рекомендуют всегда очищать ввод перед его использованием. Они также предлагают использовать функции очистки PHP. Но, похоже, ничто не решает проблему, связанную с тем, что очистка данных перед их сохранением может привести к тому, что сохраненные данные будут отличаться от введенных пользователем.
Вопрос
Я хотел бы получить описание подхода, который использовался в реальном мире для решения этой проблемы? Или некоторые отзывы от тех из вас, у кого больше опыта, чем у меня, о том, что это не проблема в реальном мире, и обычной практикой является просто очистка данных и их хранение без дальнейшего беспокойства или обратной связи с пользователем.
Мои мысли о возможных решениях
Более тщательной схемой было бы считать антисанитарные данные недействительными и сообщать пользователю, что не так с их вводом. Но это кажется непрактичным и потребует довольно длительных функций очистки для предоставления какой-либо конкретной и полезной обратной связи пользователю. Это также делает существующие функции очистки WP / PHP несколько неактуальными.
Практическим компромиссом может быть сравнение очищенных данных с необработанными данными, а затем простое уведомление пользователя о том, что что-то было очищено перед сохранением… таким образом, они могут, по крайней мере, проверить сохраненные данные, чтобы убедиться, что они довольны ими.
Спасибо за вашу помощь.
Выводы
Ответ, который я принял, был полезным и привел меня к решению для моего конкретного варианта использования, но я хотел добавить несколько собственных моментов.
Во-первых, при повторном чтении документации WP я обнаружил, что не рекомендуется проверять, а затем очищать перед записью в базу данных. Он рекомендует проверять, но предполагает, что очистка входных данных может быть более удобной, если конкретная ситуация не требует строгой проверки. В нем также говорится, что используйте одно или другое, а не оба. Поэтому я не думаю, что документация WP неверна в этом, я просто неправильно ее прочитал.
Во-вторых, я не понимал, что параметризованные запросы настолько эффективны против SQL-инъекций. Итак, я решил, что очистка входных данных перед их использованием в запросе к БД была разумной вещью. Но, похоже, в этом нет необходимости.
И, наконец, теперь я понимаю, что все дело в контексте … проблема заключается в обеспечении безопасности данных для конкретного использования. В этом смысле дело не в том, что один метод подходит только для ввода, а другой — только для вывода. Мне нужно подумать о проверке, очистке или экранировании при выполнении каких-либо действий с данными — например, записать их в БД, использовать в вычислениях, распечатать на экране или вставить в документ PDF. И во всех случаях мне просто нужно подумать о том, как я делаю это безопасным для этого конкретного использования. Очистка «ввода» может быть вполне уместной — если это быстро и легко, делает данные безопасными для всего, что мне нужно сделать, и не делает данные неточными. Другим примером является функция WordPress esc_url_raw(), которая, как указано в руководстве, специально предназначена для использования при сохранении URL-адреса в базе данных. Итак, идея о том, что экранирование подходит только для «вывода», вводит в заблуждение.
В итоге я проверил входные данные перед записью их в базу данных. Мне также не нужно было их очищать. Поэтому я, если это неверно, сообщаю пользователю. Если это допустимо, оно записывается в БД в исходном виде. И я избегаю этого, прежде чем отображать его обратно пользователю.
Ответ №1:
Наилучшей практикой, по-видимому, является очистка данных перед отправкой их в базу данных.
Это распространенное заблуждение. Очистка должна выполняться только для данных, которые выводятся, например, для предотвращения XSS, и даже тогда только в крайнем случае. Именно потому, что это может необратимо уничтожить исходные данные.
Проверка — это ваша первая линия защиты. Убедитесь, что данные правильно отформатированы и действительны в своем контексте — только это; не ищите специальные символы, не переусердствуйте. Если это недопустимо — отклоните его, не пытайтесь извлечь из него «хорошие» части.
Тогда при хранении в базе данных вам просто нужно использовать параметризованные запросы — это на 100% эффективно против SQL-инъекций. Если вы не искажали данные на предыдущем шаге, вы сохраняете их в исходном виде.
И, наконец, когда данные выводятся, именно там вы ДОЛЖНЫ экранировать специальные символы в соответствующем контексте, чтобы они были правильно отображены; или очистить их, если у вас нет другого выбора (т. Е. Контекст неясен, и поэтому вы не можете выполнить правильное экранирование).
Комментарии:
1. Спасибо, но… Вы говорите, что очистка связана с выводом, но эта страница из руководства по плагинам WordPress developer.wordpress.org/plugins/security/securing-input содержит целый раздел «Защита (очистка) ввода», и это именно то, о чем я спрашиваю … очистка ввода. У меня нет проблем с очисткой (экранированием) выходных данных.
2. Как я уже сказал, это распространенное заблуждение. К сожалению, руководство WP по этому вопросу также неверно.
Ответ №2:
Похоже, вы беспокоитесь о чувствах пользователя, это хорошо. Есть несколько вещей, которые вы можете сделать.
Используйте html-форму pattern
— наверняка ни одно имя не нуждается в знаках типа < > amp; $ " ...
— исключите это с помощью pattern
, используйте css :invalid
и :invalid:focus
, чтобы сообщить пользователю перед отправкой, если что-то не так. Это очень легко и просто.
Затем php проходит дальнейшую проверку и очистку WP.
Вы можете использовать промежуточное состояние — после «промывки» — отобразить окончательную версию (без ввода) с помощью 2 кнопок — сохранить или исправить — пусть пользователь решает, большинству из нас не нравятся эти повторения «вы уверены? нажав отправить, вы имеете в виду отправить?» — но, возможно, с таким релевантным контентом пользователи хотели бы иметь последний шанс, и они хотят увидеть окончательную версию (без входных данных, флажков и т.д.).
Теперь вы помещаете принятую версию в базу данных (подготовленную).
Сравнивать необработанные данные с промытыми нецелесообразно, честно говоря, это отстой — пользователи не будут программистами — они просто не смогут правильно понять «мы очистили ваши ответы, и теперь они на 345 символов короче. Извините за неудобства «
Не волнуйтесь слишком сильно
…существует немецкая фамилия ‘Ei’ — всего 2 символа, поэтому шаблон не может требовать больше 2.