Как предотвратить неавторизованные пользователи от удаления объектов в моей доменной модели? - PullRequest
2 голосов
/ 05 июня 2010

Я получил похожую модель домена

  • 1) Пользователь. Каждый пользователь получил много городов. @OneToMany(targetEntity=adv.domain.City.class...)
  • 2) Город. В каждом городе есть много районов @OneToMany(targetEntity=adv.domain.Distinct.class)
  • 3) Distintc

Моя цель состоит в том, чтобы удалить отчетливое, когда пользователь нажимает кнопку удаления в браузере. После этого контроллер получает идентификатор отличного и передает его в бизнес-слой. Где метод DistinctService.deleteDistinct (Long однозначный) должен делегировать деление на Слой DAO.

Так что мой вопрос в том, где установить ограничения безопасности и как лучше всего это сделать. Я хочу быть уверен, что я удаляю отличную от реального пользователя, то есть настоящего владельца города, а город - настоящего владельца отличного. Поэтому никто, кроме владельца, не может удалить ditinct, используя простой URL-адрес, такой как localhost / deleteDistinct / 5.

Я могу получить пользователя из httpSession в моем контроллере и передать его на уровень бизнес.

После этого я могу получить все города этого пользователя и проиллюстрировать их, чтобы убедиться, что в citie.id == однозначный_город_ид, а затем удалить отдельный.

Но, на мой взгляд, это довольно нелепо.

Также я могу написать SQL-запрос, как это ...

delete from 
  t_distinct 
where 
  t_distinct.city_id in (
    select 
      t_city.id 
     from 
       t_city 
       left join t_user on t_user.id = t_city.owner_id 
     where 
       t_user.id = ?
  ) 
  and t_distinct.id = ?

Итак, как лучше добавлять такие ограничения?

Кстати, я использую Hibernate, Spring, Spring MVC ..

Спасибо

Ответы [ 4 ]

5 голосов
/ 05 июня 2010

То, что вы просите, не является предотвращением SQL-инъекций. Вы должны убедиться, что пользователь, пытающийся удалить, авторизован.

Пока вы проверяете, что пользователь, обращающийся к странице, имеет права на удаление строки, которую вы пытаетесь удалить (это будет проверено на бизнес-уровне), и ТОЛЬКО разрешаете команду удаления, если пользователь аутентифицирован и авторизован для выполнить действие.

4 голосов
/ 05 июня 2010

С Hibernate вам не нужно беспокоиться о SQL инъекций. Он всегда использует готовые утверждения, поэтому вы в безопасности.

Что касается вашего конкретного случая, это не инъекция sql. Но чтобы предотвратить это, выполните проверку в контроллере - имеет ли зарегистрированный в данный момент пользователь требуемый идентификатор.

В зависимости от размера приложения вы можете реализовать некоторую общую схему безопасности с настройками владения и применить ее (используя AOP).

0 голосов
/ 06 июня 2010

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

Это можно сделать так ...

User userFromHttpSession ... Long bookId = загрузить страницу, получить bookId, загрузить книгуget bookId

Список книг = userFromHttpSession.getBooks ();... перебираем книги и выясняем, является ли один из book.id == bookId ... тогда, если владелец книги является владельцем httpSession, затем продолжаем Удалить

Это как слишком много SQL-запросов и слишком многокод, вероятно, есть лучшее решение.В любом случае, спасибо за ваши ответы

0 голосов
/ 05 июня 2010

Просто используйте свою голову, используйте кавычки * все из внешнего (или, если на то пошло, изнутри) источника, прежде чем он будет вставлен в оператор SQL, и проверяйте данные по мере их поступления. Или используйте подготовленные операторы.

* Редактировать: Под «кавычкой» я понимал функции, подобные PHP * mysql_escape_string()

...