Приложение, критически важное для безопасности - проверка строки базы данных - PullRequest
0 голосов
/ 16 ноября 2010

Это, возможно, немного расплывчато, но я надеюсь, что среди всех людей на SO найдутся те, кто сталкивался с подобными проблемами раньше.

Справочная информация
Наше приложение представляет собой службу C # / .NET, которая контролирует заказы на поезда.Мы используем LINQ-to-SQL для хранения состояния железнодорожной сети и обучения заказов в базе данных SQL Server 2005.
У нас есть требование безопасности, согласно которому программное обеспечение COTS само по себе не может быть «доверенным».

Требование
Таким образом, риск был зафиксирован как: "SQL-сервер или операционная система изменяет статические или динамические данные."
Наш мандат: "Данные хранятся вбаза данных должна быть проверена таким образом, чтобы при чтении она могла быть подтверждена кодом доступа к данным, что она не изменилась со времени последней фиксации. "

Вопрос
Я бымне нравится находить "автоматический" способ выполнения этого требования.
Если это не так, способ выполнить условие без необходимости создавать столбцы в каждой таблице базы данных для хранения вычисленных хэшей (которые мы затем должны проверять причтение.)

Ответы [ 2 ]

1 голос
/ 16 ноября 2010

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

Это тривиально.При всех уровнях изоляции без грязного чтения, кроме моментального снимка, считанные данные являются последними подтвержденными данными.По определению, он не изменился со времени последнего коммита (другими словами, если он изменился, то новые значения являются последним коммитом).Случайные изменения (поскольку требования упоминают «ОС изменяет данные») называются «повреждением данных» и фиксируются контрольной суммой страницы или TDE .

реальное требование заключается в том, что значение не изменилось в БД с момента чтения в приложение?Затем Оптимистический контроль совпадений , вот и все, что нужно сделать.Просто добавьте каждое «старое» значение в предложения UPDATE WHERE, и оно позаботится о себе.Если вы не обновили ни одну строку (и вы узнаете об этом, либо проверив @@ ROWCOUNT, либо используя предложение OUTPUT), то вы знаете, что строка изменилась. Упреждающее кэширование также может быть развернуто.

1 голос
/ 16 ноября 2010

Может быть, что-то вроде контрольной суммы MD5, которая сохраняется в той же или в другой таблице с основными данными. Контрольная сумма будет сгенерирована вашим приложением C #, поэтому, если кто-то сделает обновление с использованием необработанного SQL, контрольная сумма будет отключена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...