本主题讨论 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 注入攻击。