лучше ли экранировать / кодировать пользовательский ввод перед сохранением его в базе данных или сохранить его в том виде, как он есть в базе данных, и экранировать его при получении? - PullRequest
4 голосов
/ 01 марта 2012

Я использую функцию htmlspecialchars() для предотвращения XSS-атак. У меня есть сомнения относительно того, что является лучшим способом для хранения данных в базе данных из следующих.

Метод 1: Сохранение введенных пользователем значений после применения функции htmlspecialchars(). Используя это, пользовательский ввод "<script>" станет "& lt; script & gt;" .

Метод 2: Сохраните пользовательский ввод как есть и примените метод htmlspecialchars() при получении данных и их отображении на странице.

Причина, по которой я сомневаюсь, заключается в том, что при использовании метода 1 в базе данных будут накладные расходы, в то время как при использовании метода 2 данные необходимо преобразовывать снова и снова при запросе через php. Поэтому я не уверен, какой из них лучше.

Для получения дополнительной информации я использую htmlspecialchars($val, ENT_QUOTES, "UTF-8"), чтобы преобразовать 'и' также.

Пожалуйста, помогите мне прояснить мои сомнения. Также предоставьте объяснение, если это возможно.

Спасибо.

Ответы [ 4 ]

10 голосов
/ 01 марта 2012
  1. Почему вы ожидаете, что вы всегда будете использовать данные в контексте HTML?«Я <3 тебя» и «Я <3 тебя» - это не одно и то же <em>данные .Поэтому храните данные так, как они предназначены в базе данных.Нет причин хранить его сбежавшим.
  2. HTML, экранирующий данные, когда и только когда это необходимо, дает вам уверенность в том, что вы делаете.Это:

    echo htmlspecialchars($data);
    

    намного лучше, чем:

    echo $data; // The data should already come escaped from the database.
                // I hope.
    
5 голосов
/ 01 марта 2012

Даже лучше причина в том, что при усечении до определенного пространства вы застрянете с мерзостями, такими как "&quo...".Не поддавайтесь искушению возиться со своими данными больше, чем требуется минимум.Если вас беспокоит повторная обработка данных, кэшируйте их.

3 голосов
/ 01 марта 2012

Моя рекомендация - хранить данные в базе данных в чистом виде.Единственная причина, по которой вы хотите преобразовать его в &lt;script&gt;, заключается в том, что вам нужно будет отобразить его в документе HTML позже.Но самой базе данных не нужно знать, что вы делаете с данными после их извлечения.

0 голосов
/ 01 марта 2012

Наряду с XSS-атаками, не следует ли вам также беспокоиться об атаках с использованием SQL-инъекций, если вы вводите пользовательский ввод в базу данных? В этом случае вам может понадобиться экранировать пользовательский ввод ПЕРЕД помещением его в базу данных в любом случае.

...