Действительно ли безопасно позволить пользователям сделать свои собственные шаблоны Django с рядом предварительно определенных переменных и затем представить этот шаблон на сервере? Я только передал бы очень ограниченный набор параметров к render
, все из которых являются строками. Шаблоны были бы чем-то как:
hey, my name is {{name}}.
Так, вопрос, там какие-либо django теги шаблона, которыми можно злоупотребить для получения информации, которую пользователи, как предполагается, не получают? Я больше всего волнуюсь по поводу {% url %}
тег.
Я заметил этот вопрос после заполнения заголовка, однако, мой вопрос немного отличается. Я, вероятно, не позволю HTML/javascript вообще, использовать Ткань/Скидку с цены или найти способ ограничить HTML очень простым набором тегов.
Существует три основных риска:
Пользователи изменяют данные. Например, рендеринг {{ request.user.kill }}
вызовет kill()
во время поиска значения. Чтобы предотвратить это, в коде модели следует установить kill.alters_data = True
. Все встроенные методы модели, изменяющие данные, уже помечены, поэтому риск связан только с вашими собственными методами или методами, предоставляемыми плохо написанными сторонними приложениями.
Пользователи получают прямой доступ к данным, которые они не должны видеть. Когда используется RequestContext
(что происходит чаще всего), в контекст рендеринга шаблона добавляется множество переменных. Добавьте пользовательские шаблоны, и вы получите довольно опасную смесь, потому что пользователь может просматривать все, что добавлено любым контекстным процессором.
Пользователи получают доступ к данным, которые они не должны видеть через отношения. Когда вы передаете экземпляр модели в шаблон, его отношения могут быть пройдены дальше, чем вы могли ожидать: {{ current_user.corporate_account.owner.ssn }}
Упс...
Хорошей профилактической мерой будет тщательный пересмотр отношений модели, чтобы убедиться, что вы не раскрываете что-то конфиденциальное.
В целом, я бы сказал, что это безопасно, если только вы знаете о вышеуказанных рисках и рендерите пользовательские строки отдельно от обычных шаблонов. И убедитесь, что вы неявно запрещаете {% debug %}, {% include %}. {% ssi %}
теги шаблонов, так как они могут выдать довольно чувствительную информацию. Возможно, вы можете перестраховаться и разрешить только переменные и фильтры, а теги управления запретить совсем.
Ну, с сервера- со стороны, это безопасно (вероятно, никто никогда не проверял это), однако пользователи, очевидно, могли генерировать любой Javascript, который они хотели бы выполнить для XSS-атак.
, включая и ssi , на мой вкус выглядит слишком опасно, особенно ssi
, который использует абсолютные пути . Я считаю, что это слишком рискованный бизнес.