2015-08-05 1 views
1

Предполагая, что в пользовательском входе не допускаются теги, и мы хотим дезинфицировать ввод пользователя до, храня его в базе данных, в Rails у нас есть варианты использования sanitize (белый список пустых тегов) и strip_tags.В Rails, который лучше защищает от атак XSS, strip_tags или санирует?

Что лучше против атак XSS? Если что-то еще лучше, что это? И почему это лучше?

+0

Вы используете рельсы 4? Основная команда rails сделала много, чтобы сделать вещи безопасными по умолчанию на полпути через рельсы 3. –

ответ

0

По состоянию на Rails 3 и живое избиение команда Rails core dev взяла, когда Rails была небезопасной по умолчанию, все строки теперь помечены как безопасные или небезопасные, при этом «небезопасные» строки являются стандартными. Вам нужно только подумать о явном управлении «безопасностью» строк в Rails при написании помощников, которые выводят HTML в ваш шаблон.

Спасаясь против санировать: В этом контексте, означает замену некоторых символов строки с управляющей последовательностью HTML, который будет удалить особое значение из текста и вызвать его визуализации, как обычный текст побега. Sanitizing, с другой стороны, означает проверку содержимого HTML для обеспечения использования только хороших HTML-тегов и атрибутов. Обратите внимание, что дезинфекция по своей сути менее безопасна, чем экранирование из-за этого, и ее следует использовать только тогда, когда отображаемый контент должен содержать разметку HTML. Примером может служить HTML-редактор WYSIWYG в текстовом поле, которое управляет кодом, который впоследствии отображается на странице.

Sanitize кодирует все теги и перетаскивает все атрибуты (не разрешенные специально для вашего случая) из переданной ему строки html. Он также разбивает теги href и src на недопустимые протоколы, чтобы предотвратить злоупотребление атрибутами js. Strip_tags, с другой стороны, разделит все предоставленные теги, включая комментарии, которые звучат точно так, как вы хотите. До тех пор, пока вы белый список Params и добавление их в БД правильно спаслось, такие как:

Title.where(author = ?, author_id) 

и не слепо вставки пользовательского ввода в вашу БД я бы комфортно с тем, как вы настройкой.

+0

Проверка - это идемпотентный процесс. Я думаю, что «фильтрация» будет лучшим термином для описания удаления чего-то неадекватного. – Gumbo

+0

A [Политика безопасности контента] (http://www.html5rocks.com/en/tutorials/security/content-security-policy/) рекомендуется при выводе «дезинфицированных» пользовательских данных, таких как HTML. Это предотвратит выполнение браузером любого XSS, который злоумышленнику удается проскользнуть через дезинфицирующее средство. – SilverlightFox