Проверка доступа пользователей к правам на определенные объекты базы данных или записи - PullRequest
0 голосов
/ 31 октября 2008

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

Чтобы пользователь не мог изменить documentID в QueryString, я предлагаю, чтобы хранимая процедура, загружающая документ, принимала UserId в качестве параметра для проверки прав на документ.

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

Мы что-то упустили? Что наиболее эффективно и безопасно? Я думал, что передача UserId с DocID в один вызов процедуры для проверки прав и получения документа была более эффективным решением.

Ответы [ 3 ]

2 голосов
/ 31 октября 2008

предлагаю хранимую процедуру который загружает документ, принимает UserId как параметр для проверки права на документ.

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

1 голос
/ 31 октября 2008

Строго говоря, с точки зрения производительности лучше всего передать UserID вместе с DocumentID в одну хранимую процедуру. У вас есть только одна поездка на сервер базы данных. Кроме того, как указали другие, если вы будете получать этот документ с других страниц или приложений, если вы будете использовать ту же хранимую процедуру, вы гарантируете, что не обойдете систему безопасности для этого.

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

1 голос
/ 31 октября 2008

ИД пользователя должен быть переменной сеанса. Правильно. Передайте documentID в строке запроса. Да.

Предполагая, что документы хранятся в базе данных, у меня будет таблица разрешений: recordID, userID и documentID. Вы делаете соединение с этой таблицей при вызове документа. Если вы не получите результат, вы не получите документ. Индексируйте все это хорошо, и это будет быстро.

...