Я создаю веб-приложение API strcutured, и в этом приложении у нас есть разные уровни, которые выполняют свою работу.
Первый слой Validation слой , который пользовательский ввод Validate , и если она проходит проверку мы двигаемся , что второй слой (который является контроль доступа слоя) в противном случае возвращают сообщение об ошибке
Второй уровень - Контроль доступа, который проверяет, есть ли у пользователя разрешение на выполнение задачи, которую он хочет выполнить. Если у пользователя есть разрешение, он перемещает запрос на следующий уровень, в противном случае возвращает сообщение об ошибке.
Третий уровень - это слой контроллера, где у нас есть логика применения
Мой вопрос в том, что нормально иметь уровень проверки перед контролем доступа? Что если пользователь пытается выполнить задачу, на которую у него нет разрешения, и мы отправляем обратно сообщение об ошибке проверки? Пользователь будет отправлять запросы в конечную точку и разговаривать со слоем проверки, и как только он пройдет проверку только тогда, он увидит сообщениеYou can't access this!
Мне кажется странным, так ли это нормально, или что может быть моим другим выбором в инфраструктуре?
источник
Ответы:
Это зависит от того, является ли знание достоверности некоторых входных данных для задачи, которую вам не разрешено, утечкой безопасности. Если это так, вы действительно должны сделать это наоборот.
Единственный безопасный ответ для неавторизованного пользователя - «Отказано в доступе». Если иногда ответом является «неправильный запрос», а иногда «отказ в доступе», вы отправляете информацию неавторизованному пользователю.
Например, вы можете проверить в проверке задачи «удалить документ», что указанный документ существует. Кто-то, у кого нет прав, сможет определить, существует ли что-то, попытавшись удалить его и сравнив, какую ошибку он получит обратно. Определенный злоумышленник может перечислить все имена документов (с определенной длиной), чтобы увидеть, какие существуют.
источник
Ну, есть несколько типов проверки:
Дешевая базовая проверка работоспособности, которая проверяет, что запрос явно не искажен.
Как правило, это, по крайней мере, частично дублируется на стороне клиента, чтобы избежать бесполезных обходов.
В любом случае, это должно быть сделано перед контролем доступа, чтобы сделать вещи проще и менее подверженными ошибкам, так как это не рискует утечки информации.
Более дорогая проверка, которая все еще не зависит от каких-либо защищенных данных приложения.
Если есть такая дополнительная проверка, то после контроля доступа это может быть не для предотвращения утечки данных, а для предотвращения DOS-атак.
Иногда простое выполнение запроса выполняет некоторую проверку неявным образом при сниженной стоимости или бесплатно, поэтому ее можно оставить здесь.
Если все проверки первого шага дублированы, возможно, имеет смысл дублировать части этой клиентской стороны.
Дополнительная проверка в зависимости от защищенных данных приложения.
Выполнение этого перед контролем доступа, очевидно, может привести к утечке информации. Таким образом, сначала сделайте контроль доступа.
источник
Должна быть некоторая проверка перед контролем доступа. Скажем, API SO имеет конечную точку «редактировать ответ», и то, может ли пользователь редактировать конкретный ответ, может зависеть от ответа (ниже определенной репутации пользователь может редактировать только свои собственные ответы). Таким образом, корректно сформированный параметр «ID ответа» должен быть проверен до того, как уровень контроля доступа вступит в игру; возможно также, что ответ существует.
OTOH, как отмечают Калет и Грег, более тщательная проверка перед контролем доступа является потенциальной угрозой безопасности.
Таким образом, жесткие правила
Следование обоим этим правилам может означать, что вы должны пройти некоторую проверку до и после проверки доступа.
источник
В дополнение к возможному разочарованию получения «отказано в доступе» после проверки ввода; Также имейте в виду, что слой проверки , если он не очень простой, всегда может нуждаться в информации из контроллера . Имея это в виду, я считаю, что позиционирование валидации за контролем доступа ближе к контроллеру имеет больше смысла.
источник
Это зависит от того, что вы подразумеваете под уровнем проверки - если под этим вы просто подразумеваете проверку синтаксиса запроса, то это безопасно и вам все равно придется что-то делать. Если ваша «проверка» использует какую-либо информацию, к которой непривилегированный пользователь не имеет доступа, она больше не является безопасной.
Вы обязательно должны иметь проверку работоспособности, прежде чем пытаться контролировать доступ, но вы должны очень четко сообщить всем сопровождающим (текущим и будущим), что эта часть не должна использовать привилегированную информацию; Любые такие проверки должны выполняться на отдельном этапе проверки после проверки подлинности.
Как проверка работоспособности для проверки работоспособности, она фактически не должна иметь каких-либо зависимостей кода на какой-либо части вашего кода ниже по конвейеру и должна быть разделена на собственный пакет, который должен быть публично опубликован без каких-либо проблем (кроме возможных юридических проблем) , Если вы не можете этого сделать, ваш «уровень проверки» делает слишком много (или ваша кодовая база - беспорядок).
источник
Нет, это не хорошо.
Если у вас есть ошибка на вашем уровне проверки, она может обойти уровень безопасности.
Распространенной ошибкой считать безопасность частью бизнес-требований. «Только пользователи, имеющие роль продаж, должны иметь возможность видеть квартальные цифры», похоже на бизнес-правило.
Но если вы хотите быть в безопасности, вы должны прочитать такое правило, как «только пользователи в роли продаж должны иметь возможность запускать код на этой конечной точке». Вы должны убедиться, что ваш сервер всегда возвращает «доступ запрещен», прежде чем он получит любой код, который вы написали или файлы на сервере.
источник