Должен ли я вызывать escape_javascript при отображении данных, извлеченных из базы данных - PullRequest
1 голос
/ 24 октября 2019

У меня есть поле, равное xss_sanatised на уровне модели перед сохранением в базе данных. Когда я хочу отобразить это, я должен снова escape_javascript это перед рендерингом в виде?

Как мой запрос должен быть похож на

User.all.pluck(:id, :name).map { id: id, name: escape_javascipt(name)}

вместо

User.all.pluck(:id, :name).map { id: id, name: name }

Когда я непосредственно ввел <script>alert('hi')</script> в базу данных, он фактически выполнялся в пользовательском интерфейсе. Хотя я не смог бы записать это значение в базу данных без прямой записи SQL-запросов.

Итак, должен ли я использовать escape_javascript для всех полей или нет?

Редактировать

Это отображается в пользовательском интерфейсе как раскрывающийся список с использованием select2

<div input="hidden" id="input"></div>
jQuery('#input').select2({
    multiple: false,
    data: <%=tech.to_json.html_safe%>,
    initSelection : function (element, callback) {
        callback(<%= esc.to_json.html_safe %>);
    }
});

1 Ответ

5 голосов
/ 24 октября 2019

Я думаю, что вы здесь запутались просто потому, что обходите правила санитарии вашего собственного приложения - напрямую записываясь в базу данных.

По умолчанию вы никогда не должны "доверять" пользовательскому вводу. Его всегда следует считать потенциально вредоносным.

Одна из причин, по которой вы можете доверять ему, заключается в том, что он предоставляется внутренними пользователями (например, вами!).

ИлиДругая причина, по которой вы можете доверять ей, заключается в том, что вы санировали ее перед ее сохранением - т.е. вы явно заблокировали любой потенциально вредоносный ввод.

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

Однако, если вы принудительно вводите небезопасный ввод в базу данных вручную, «напрямую записывая запросы SQL», то естественно, что вышеприведенное предположение о том, что «ввод безопасен», становится недействительным. Но это «невозможный» сценарий, поэтому я не буду особенно беспокоиться о нем.

Если вы действительно хотите быть вдвойне безопасным в этом, тогда вы можете повторно санировать ввод перед рендерингом. Это. Но это, скорее всего, излишне, на мой взгляд. (В любом случае, вам нужно только санировать его один раз!)


escape_javascript - это отдельный метод, который не имеет никакого отношения к санации пользовательского ввода. Это не имеет отношения к проблеме, которую вы описываете.

Если вам нужно вызвать escape_javascript для значения, то сделайте это. Но опять же, поскольку вы не предоставили доступ к коду визуализации представления, я не могу посоветовать, действительно ли он нужен.

...