Asp.net MVC 3 Шифровать скрытые значения
Я ищу предложения или действительно хорошие учебники о том, как обрабатывать передачу идентификаторов назад и вперед безопасным способом от клиента к серверу, я не передаю идентификаторы пользователей или что-то подобное, однако я мог бы передать идентификатор для таблицы элементов строка. Я хотел бы скрыть эти идентификаторы от пользователей. Я хотел бы избежать их размещения на странице в целом, однако, учитывая, что они являются ПК, у меня нет выбора, кроме как пинг-понг значение от клиента к серверу и обратно.
Спасибо за любую помощь.
редактировать: я планирую проверить, есть ли у пользователя разрешение на такие действия, однако я все же хотел бы скрыть данные.
4 ответа
Простое предложение:
1) Добавьте столбец guid в ваши сгенерированные таблицы (значение по умолчанию: новый id()). Создайте индекс для столбца guid. Передайте проводника туда-сюда, а не ваш ПК.
2) Это полностью защищает ваши идентификаторы? Нет. Но это мешает пользователям угадывать числовые ПК.
3) Всегда проверяйте, что аутентифицированный пользователь имеет доступ к записи.
Вы действительно должны просто сделать вашу безопасность на сервере. Любая запись, к которой у пользователя есть доступ, должна быть доступна, а любая запись, к которой у него нет доступа, не должна быть доступной. Не имеет значения, знают ли они, что это за идентификатор, потому что у них есть доступ к данным в любом случае. Все, что они могут сделать, взломав, они могут сделать в пользовательском интерфейсе.
Поэтому просто не имеет смысла пытаться их скрыть.
Вы можете использовать проект расширений безопасности MVC https://mvcsecurity.codeplex.com/.
Скажем, поле, которое вы хотите защитить, это Ид...
На вашем контроллере добавить способ сообщения:
[ValidateAntiModelInjection("Id")]
В вашем представлении добавить:
@Html.AntiModelInjectionFor(m => m.Id)
@Html.HiddenFor(m => m.Id)
После публикации ваше поле Id будет подтверждено.
Как вы уже упоминали, не рекомендуется выводить PK строк таблицы элементов в View, как если бы они находились в HTML страницы, они были доступны для просмотра.
Если я правильно понимаю, под "[скрытием] этих идентификаторов от пользователей" я предполагаю, что вы имеете в виду как-то запутывать идентификаторы, поэтому даже если они взяты из HTML представления, они мало что значат в их индивидуальном контексте.
Одним из способов достижения вышеуказанного является использование ViewModel для вывода ваших связанных данных в представление, но в вашем конкретном классе ViewModel вы можете иметь некоторую пользовательскую логику свойств для кодирования PK с помощью алгоритма шифрования AES (двухстороннего), соль для шифрования - это то, что известно только вам (и вашему серверу).
Это был бы один из способов "защитить" ПК в представлении.
При таком подходе вам, возможно, придется учитывать снижение производительности при шифровании / дешифровании PK, когда эти данные пересылаются взад-вперед!
Это может быть интересно, если вы пойдете по пути шифрования:
Простое небезопасное двустороннее "запутывание" для C#
Вы также можете достичь некоторой большей непрозрачности без шифрования с помощью поиска значения ключа в памяти (данные кэша или сеанса), который выводит произвольные числа в качестве идентификаторов в представление для каждого из ваших элементов таблицы и, когда извлекается из представления, PK обратный взгляд из коллекции в памяти.