gpt4 book ai didi

c# - 为什么不向客户透露来源的类型和身份?

转载 作者:行者123 更新时间:2023-11-30 13:45:24 25 4
gpt4 key购买 nike

在第 220 页,C# 语言规范版本 5.0 说:

It is important ... to ensure that the result of a query expression is never the source object itself, as that would reveal the type and identity of the source to the client of the query.

为什么向查询的客户端显示源的类型和身份会有问题?

例如,from c in customers select c 形式的查询表达式转换为 customers.Select(c => c) 而不仅仅是 客户

在上述情况下,在我看来,将 customers 返回给客户端与返回 customers.Select(c => c) 的结果一样好>。为什么不是呢?

最佳答案

虽然 Robert McKee 的回答是合理的并且提出了一个有趣的观点,但它实际上并不是我们在编写规范的那一部分时考虑的主要问题。我们真正想到的问题是:

class C 
{
private List<int> myList = new List<int>();
// Only the code in C can add items to the list.
public IEnumerable<int> Items
{
get
{
return from item in myList select item;
}
}
}

假设您有一个 C在手里。您应该能够编写这段代码吗?

((List<int>)c.Items).Add(123);

列表上查询的存在不应授予获得查询更改列表能力的代码!它应该授予该代码执行查询的权利,仅此而已。

现在想象一下,而不是 List<int> ,查询实际上包装了一个数据库调用。如果调用者可以从查询中获取基础数据库,那么他们也许可以查询或编辑查询作者不希望他们进行的查询。

当然,LINQ 并非设计为安全系统,如果它是您抵御想要攻击您的数据库的代码的唯一防线,您可能非常容易受到攻击。但是,当所有安全系统的组件使用良好的“纵深防御”时,它们的工作效果会更好。永远不要泄露查询正在查询的集合是防御策略的一部分。

有关此功能的更多信息,请参阅我关于该主题的文章:

http://blogs.msdn.com/b/ericlippert/archive/2008/05/12/trivial-projections-are-usually-optimized-away.aspx

关于c# - 为什么不向客户透露来源的类型和身份?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29947492/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com