为什么maxConcurrentSessions默认值如此之低?安全值是多少?

4
在WCF中,maxConcurrentSessions默认为10,因此限制服务器最多只能有10个打开的TCP连接。
为什么会这样呢?
如果一个服务器只有一些(或两个)客户端,但由于需要向客户端发送事件而需要保持每个客户端的netTcpBinding,那么将其设置为非常高的值是否安全?
2个回答

11
我假设您的实例模式为每个会话。如果需要,您可以将该值设置为Int32.Max。然而,了解WCF调节概念非常重要。
该值非常低,以防止DOS攻击,因为WCF团队希望服务在默认情况下具有“安全性”。
这里有一篇很好的文章,可以看看这篇博客文章
请注意,这些值非常低...比许多人想要的要低得多。WCF团队在这里的想法是,他们希望WCF在默认情况下具有“安全性”,并减少针对您的服务发起DOS攻击的可能性。这个想法听起来很好,但在实践中会引起重大问题。
事实上,如果您正在使用像WsHttpBinding这样支持会话的绑定,那么您几乎肯定会遇到这些问题。为什么呢?默认会话数为10,这一开始似乎意味着10个用户可以同时访问您的服务。然而,WCF会话不是Web会话。与服务器管理并通常使用http cookie跟踪的Web会话不同,WCF会话是由客户端代理启动的,并且在超时或客户端发送显式请求以放弃会话之前不会结束。关键是,由于每个代理实例都启动自己的会话,同时进行几个请求的用户可能会同时使用多个会话。现在您可能会认为,如果没有执行这种操作的多线程代码,您就是安全的...但这并不完全正确。因为用户必须向服务器发出显式请求以取消其会话,所以您可能会意外地保留会话。那些一直在使用WCF会话的人们很熟悉这个问题。因此,我们需要对这些参数进行适当的调整,以便在不牺牲安全性的情况下更好地支持会话和并发访问。与ASMX服务一起工作的人往往没有意识到他们需要关闭代理对象,少数知道对象需要被关闭的人通常会错误地将其视为可丢弃的对象,这导致会话被保留。请记住,默认会话限制为10,这意味着如果您在相对较短的时间内使用WsHttpBinding调用服务十次,则可能会锁定您的服务直到会话过期。

WCF团队做出的决定可能令人困惑。为了限制攻击者发动DOS攻击,他们使得对您的服务进行DOS攻击变得更加容易。现在,您不再需要资源来向服务器发送请求以使其无法响应,而只需进行一些调用而不显式请求关闭连接并达到会话计数的最大值。除非将此值设置得非常高,否则您的服务器可能拒绝接受任何传入连接,尽管它的CPU使用率为零。


1

您可以将此设置得更高 - 只要您的服务器有足够的资源来处理请求。默认值为10,因为这将轻松击败任何针对您服务的拒绝服务攻击。如果您有一台专用于此单一服务的强大服务器,您可以将其设置为10,000。您不能使用一个神奇的数字来解决这个问题 - 您需要在需求和服务器资源之间取得平衡,并且这个最大并发会话数有助于防止崩溃!


在建立了10个连接之后拒绝使用您的服务是一种有趣的方式来防御拒绝服务攻击... 另一方面,这对环境有好处,因为服务器CPU将保持相当冷静。 - Evgeniy Berezovsky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接