2012-04-18 4 views
0

Я новичок в Django. Прошлой ночью я много работал над тем видом, который позволил бы мне редактировать любые объекты в моем текущем проекте; Главы, Истории и Миры. Чтобы убедиться, что я точно знаю, какой объект базы данных изменяется, я добавил запись в базу данных для редактирования таблиц, которая хранит хэш, тип редактируемого объекта (например, «Глава») и идентификатор этого объекта объект, найденный в базе данных. Хэш добавляется в форму как скрытый ввод.Обнаруживается общий вид обновления update_object Django? Должен ли я продлить его или сделать свой собственный для обеспечения безопасности?

На обратной стороне, после отправки формы, я беру хэш и использую его, чтобы найти связанный элемент редактирования в базе данных. Затем я использую это, чтобы найти, какой объект изначально редактировался. Это было сделано по двум причинам:

  1. Я могу знать, какой предмет действительно редактируется. Если все элементы формы были изменены, сравнивать (кроме URL-адресов) нечего, чтобы действительно знать, какой объект редактируется.

  2. Пользователи должны не иметь возможности взломать интерфейс, чтобы делать странные вещи, например, изменять неправильные истории.

Сегодня я обнаружил, что Django имеет общий вид под названием update_object. Кажется, мне это очень нравится. Но учитывая, что он не использует автоматическую базу данных для обеспечения того, чтобы редактируемый объект редактировался или даже определял , который редактирует объект, является ли это безопасным? конечно, должен быть простой способ взломать его на переднем конце, изменив HTML-элементы.

Во-вторых, если это вызывает обеспокоенность, вы бы рекомендовали мне сохранить собственное редактирование или расширить расширение update_object или какое-либо другое решение?

И, наконец, я собираюсь сделать это правильно? Пожалуйста, поправьте меня, если я не буду думать о решениях этой проблемы правильно.

Я не чувствую, что это вопрос, который требует кода. Это скорее общий вопрос о безопасности форм, поскольку они относятся к Django.

Спасибо,

ParagonRG

ответ

1

Ваша задача узнать, какой объект они редактирования, как правило, решается либо путем проверки URL или скрытой форме элемента, который только имеет идентификатор базы данных.

Прежде чем принимать какие-либо изменения из пользовательской формы, вы должны убедиться, что у пользователя есть разрешение делать то, что они просят делать, и что изменения имеют смысл. Обычно вы делаете это с помощью валидаторов форм и/или явных проверок в представлении. Это несколько более безопасный способ решения этой проблемы, поскольку он гарантирует, что люди не делают изменения БД, которые им не разрешено делать, тогда как в объектном подходе Edit вполне возможно, что они смогут обойти это.

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

(Также: если вы используете Django 1.3+, лучше использовать новый класс UpdateView, а не функциональный update_object.)

+0

Спасибо, я не заметил, что эти общие представления устарели! Мне нужно будет общаться с UpdateView. Кроме того, интересно, я не вижу скрытого элемента формы, который указывает, какой объект редактируется. Проверьте это здесь (это довольно коротко): http://dpaste.com/733945/. Это объект World, а его идентификатор - 1. Больше нечего его идентифицировать, и я не вижу ни того, ни другого. Как он мог работать без него? – Paragon

+1

@Paragon Я полагаю, что он использует URL, а не скрытый идентификатор, что в значительной степени эквивалентно. Как это бывает, вы можете увидеть источник просмотров [здесь] (https://github.com/django/django/blob/master/django/views/generic/edit.py); если вы следуете следу наследования назад, он заканчивается [этим методом] (https://github.com/django/django/blob/master/django/views/generic/detail.py#L19), который находит объекты на основе на 'pk' или' slug' или любой аргумент в шаблоне URL. – Dougal

+0

Очень полезно, спасибо. Это наводит мой разум на правильный путь. – Paragon