Безопасность (LINQ to DataSet)
В этом разделе рассматриваются проблемы безопасности в LINQ to DataSet.
Передача запроса недоверенному компоненту
Запрос LINQ to DataSet можно сформулировать в одной точке программы и выполнить в другой. В месте своего создания запрос может ссылаться на любые элементы, видимые в этой точке, например закрытые элементы класса, которому принадлежит вызывающий метод, или символы, представляющие локальные переменные или аргументы. Во время выполнения запрос сможет получить доступ к элементам, на которые он ссылался при создании, даже если для вызывающего кода они невидимы. Код, выполняющий запросы, не имеет произвольно добавляемой видимости, то есть он не может выбирать, к каким элементам обращаться. Он сможет получить доступ только к тому, к чему обращается запрос, и только через сам запрос.
При этом подразумевается, что при передаче ссылки на запрос другому фрагменту кода компонент, получающий запрос, является доверенным и может получить доступ ко всем открытым и закрытым элементам класса, на которые ссылается запрос. Как правило, запросы LINQ to DataSet не должны передаваться ненадежным компонентам, если запрос не был тщательно создан, чтобы он не предоставлял информацию, которая должна храниться в закрытом режиме.
Внешние входные данные
Приложения часто получают внешние входные данные (от пользователя или другого внешнего агента) и выполняют действия над этими входными данными. В случае с набором данных LINQ to DataSet приложение может создать запрос определенным образом на основе внешних входных данных или использования внешних входных данных в запросе. Запросы LINQ to DataSet принимают параметры везде, где принимаются литералы. Разработчикам приложений следует использовать параметризованные запросы, а не внедрять литералы из внешних агентов непосредственно в запрос.
Любые входные данные, прямо или косвенно полученные от пользователя или внешнего агента, могут иметь содержимое, использующее синтаксис целевого языка для выполнения несанкционированных действий. Это явление называется атакой путем внедрения кода SQL по названию схемы атаки, где целевым языком является Transact-SQL. Вводимые пользователем данные, внедренные непосредственно в запрос, используются для удаления таблицы базы данных, вызова отказа в обслуживании или других изменений выполняемой операции. Хотя композиция запросов возможна в LINQ to DataSet, она выполняется через API объектной модели. Запросы LINQ to DataSet не создаются с помощью строковых манипуляций или объединения, так как они находятся в Transact-SQL и не подвержены атакам внедрения SQL в традиционном смысле.