#reactjs #django #django-rest-framework #ckeditor #code-injection
#reactjs #django #django-rest-framework #ckeditor #внедрение кода
Вопрос:
Я успешно реализовал django-ckeditor
с помощью Django REST Framework и React, но я почти уверен, что способ, которым я это сделал, небезопасен.
Я создал художественный блог, где каждое произведение искусства имеет форматированное текстовое описание. Вот базовый пример одной из моих моделей с форматированным текстовым полем:
from ckeditor.fields import RichTextField
class Artist(models.Model):
biography = RichTextField(blank=True, null=False)
...
Итак, если сохранить его биографию как «Он был хорошим парнем!«, То DRF сериализует это как:
<p>He was a <em><strong>nice guy!</strong></em></p>
В моем приложении React я отображаю его с помощью:
<div dangerouslySetInnerHTML={{__html: artist.biography}} />
Но, как следует из названия, в документации React говорится, что это, как правило, рискованно.
Это личный блог, поэтому я не беспокоюсь о том, что другие пользователи вводят код в сообщения. Тем не менее, я уверен, что когда-нибудь я захочу предоставить своим пользователям форматированный текстовый редактор.
Есть ли способ реализовать CKEditor с помощью Django rest framework, который не требует от меня использования dangerouslySetInnerHTML
? Если нет, то как я могу безопасно реализовать форматированный текстовый редактор и по-прежнему использовать его с DRF?
Обновить
Я провел еще немного исследований и обнаружил кое-что от Mozilla под названием Bleach. Они описывают это так:
Bleach — это библиотека очистки HTML на основе разрешенного списка, которая экранирует или удаляет разметку и атрибуты.
Они продолжают говорить:
Bleach предназначен для очистки текста из ненадежных источников. Если вы обнаружите, что прыгаете через обручи, позволяя администраторам вашего сайта делать много вещей, вы, вероятно, находитесь за пределами вариантов использования. Либо доверяйте этим пользователям, либо нет.
Итак, в этом случае я не думаю, что мне это нужно. Возможно, я буду использовать его в будущих проектах.
Это все еще не помогает мне избежать использования dangerouslySetInnerHTML
, но это самое практичное решение, которое я могу придумать.
Комментарии:
1. Извините, если это не относится к вашему вопросу, но я должен спросить, поскольку вам удалось интегрировать DRF с CKEditor. Мне было интересно, можете ли вы на самом деле ОПУБЛИКОВАТЬ какой-либо форматированный текст, используя DRF, и если да, то как.
2. @FuriousMathematician Я пока этого не делал, но я не вижу никаких причин, почему вы не могли. Я использовал его только на сайте администратора. Я почти уверен, что
RichTextField
это просто подклассmodels.TextField
с другим виджетом. Текст, в котором выPOST
должны содержать HTML-теги, но это не обязательно, и он не является особенным. Вы должны иметь возможность использовать обычный старый JavaScript CKEditor в форме, которую вы публикуете, как и любые другие данные. Думайте об этом как о необычном<textarea>
поле. Это может быть полезно: ckeditor.com/docs/ckeditor4/latest/guide/dev_framed.html