Проверка доступа пользователей к правам на определенные объекты базы данных или записи

StackOverflow https://stackoverflow.com/questions/254610

Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

Другие советы

  

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top