У меня есть небольшая контактная форма, которая требует тему, имя, адрес электронной почты и сообщение. Все эти поля очищены с помощью:
function sanitize($string){
return htmlentities($string, ENT_QUOTES, 'UTF-8');
}
Я отправляю письмо используя mail()
функция из PHP, и я использую subject
поле в качестве заголовка / темы письма. Проблема в том, что в теме у меня есть одна цитата:
I'd like to explore
Но после того, как я его санирую, я получаю электронное письмо в почтовом ящике, но эта одинарная кавычка очищается и выглядит так:
I'd like to explore
Как я могу сохранить свою форму в безопасности, но в то же время, как мне сделать так, чтобы моя тема письма была с одинарной цитатой, а не с 'd
-вещь?
Вы храните данные, используя sanitize
функции, и если вы хотите отобразить данные, вам нужно «очистить» до исходного формата.
$str = 'I'd like to explore';
echo html_entity_decode($str, ENT_QUOTES, 'UTF-8');
Строго говоря, хранение любых данных не является угрозой безопасности. Однако процесс хранения данных может вызвать проблемы с безопасностью. Использование сущностей HTML обычно делается для хранения данных в базах данных и использования их позже. Но лучший способ сохранить эти данные — использовать подготовленные операторы, что делает это совершенно ненужным.
Вопрос действительно в том, для какого хранилища вы находитесь дезинфицирующий.
htmlentities
используется, когда вы хотите напечатать сгенерированный пользователем контент в виде HTML на вашем собственном сайте. Генерируемый пользователем контент может содержать символы HTML-разрыва, поэтому он заменяет символы объектами HTML. (Неправильно '
может завершить строку или если тролль вставляет </div>
, вы весь макет вашего сайта сломаете.)
Тот '
-все '
а также является, с точки зрения любого html-рендеринга-движка, апостроф и будет отображаться как таковой. Ты можешь найти список этих лиц онлайн.
Обратная сторона этого процесса html_entity_decode
, чтобы снова получить простой текст.
В отношении вашего варианта использования сохранности вашей формы: htmlentities
это не правильный инструмент для этого.
Если вы хотите отправить это письмо в виде простого текста, сохраните его в виде простого текста. Это правда, что вы не должны доверять сгенерированному пользователем контенту и поведению, однако вам следует защищать от проблем с вставкой базы данных (подготовленных операторов) и предотвращать повторение POST в самой форме, чтобы не спамить людей.
Тем не менее, нет никакого вреда в том, чтобы воспринимать пользовательский ввод как необработанный текст и отправлять его как необработанный текст. (Если вы хотите отправить электронное письмо в формате HTML с пользовательским контентом, то htmlentities
пригодится и для этого.)
Санитарная обработка выполняется в контексте. Другими словами, вы должны знать, против чего вы «дезинфицируете»: инъекция SQL, атаки html-скриптов или что нет. Имея это в виду, правильным подходом является решение каждой проблемы в отдельности: очистка для внедрения SQL при сохранении в БД, но хранение данных как можно ближе к «оригиналу». Это означает, что данные в БД будут «очищены». Затем, в зависимости от того, что вы собираетесь делать с данными, вы обрабатываете их соответствующим образом: отправка по электронной почте? Просто сбросьте содержимое. Показывать на веб-странице? html_entities
Это.
Обратите внимание, что вопрос «оптимизации» в том смысле, что нет необходимости обрабатывать дезинфицирующее средство каждый раз, когда вы выводите контент, отличается. Это должно рассматриваться отдельно, если это вообще необходимо.
Это зарекомендовало себя на мой взгляд на протяжении многих лет.