Что лучше, Escape затем хранить Или сохранить затем избежать выхода? - PullRequest
1 голос
/ 02 апреля 2010

После долгих поисков в потоке стека я не нашел никого, кто бы говорил об этом, даже если это большой выбор. Вопрос в том, что лучше для предотвращения внедрения XSS и SQL. Экранирование данных и их сохранение. в БД или сохранить его как есть и экранировать при выводе?

Примечание: будет лучше, если вы приведете несколько примеров практики, если это возможно.

Спасибо

Ответы [ 4 ]

5 голосов
/ 02 апреля 2010

Данные должны быть должным образом экранированы SQL (или отправлены отдельно от SQL, как предлагают другие) для хранения, и HTML экранированы для отображения.

4 голосов
/ 02 апреля 2010

Для того, чтобы выполнить следующие действия, вы должны сделать следующее:

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

  2. Привязывайте входные данные к параметризованному запросу или экранируйте входные данные при формировании запроса.Обратите внимание, что экранирование входа не меняет входа.База данных всегда будет содержать точную строку, введенную пользователем.

  3. При отображении пользователю необходимо экранировать ее в соответствии с контекстом.Существует около 5 различных способов экранирования одной и той же строки - в зависимости от того, отображаете ли вы ее в элементе HTML, атрибуте HTML, Javascript, CSS или в виде URL.Смотрите http://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet. Опять же, помните, что экранирование не изменяет строку.Пользователь должен всегда видеть точную введенную строку.

Возможно, у вас возникнет соблазн сохранить измененную строку в базе данных - но, пожалуйста, не делайте этого,Если вы избежите его для HTML, вы никогда не сможете использовать строку в JavaScript.Если вам нужно выполнить внутреннюю обработку, вам придется удалить строку.Вы скоро достигнете стадии, когда вы больше не сможете делать правильные вещи.

Помните, что экранирование - это просто способ передачи данных с одного уровня на другой.В состоянии покоя (база данных или экран) данные должны выглядеть точно так, как их вводил пользователь.

2 голосов
/ 02 апреля 2010

Ваш вопрос не имеет большого смысла, потому что попытка сохранить данные, содержащие инъекцию SQL, - это то, что вызывает инъекцию SQL.

В любом случае, вы должны использовать Параметризованные запросы для предотвращения внедрения SQL.

Для выхода из XSS / HTML я лично предпочел бы сделать это во время вставки, потому что тогда вам придется выполнять эту обработку только один раз, а не каждый раз, когда она отображается. Небольшая оптимизация, но простая.

1 голос
/ 02 апреля 2010

Escape-ввод, сохранение, затем экранирование.


Если вы храните без экранирования, вы уязвимы для SQL-инъекций.

Пример: у вас есть запрос:

mysql_query("SELECT * FROM `table` WHERE `abc`= '{$_POST['def']}';

Допустим, что $ _POST ['def'] равно

blah'; DROP TABLE `table`; SELECT * FROM `table` WHERE 'abc' = '123

Это приведет к тому, что ваш стол будет сброшен, если он не сбежал.


Если вы выводите без экранирования, вы уязвимы для XSS.

В противном случае пользователи могут внедрять вредоносный Javascript на страницы, которые могут просматривать другие пользователи.

...