【发布时间】:2010-09-17 06:06:14
【问题描述】:
我正在用 Python 编写一个程序,它将充当服务器并接受来自客户端的数据,对数据量施加硬性限制是个好主意吗?如果是,为什么?
更多信息: 因此,某些聊天程序会限制每次发送(即每次用户按下发送)可以发送的文本数量,所以问题归结为是否有正当理由,如果是,那是什么?
【问题讨论】:
我正在用 Python 编写一个程序,它将充当服务器并接受来自客户端的数据,对数据量施加硬性限制是个好主意吗?如果是,为什么?
更多信息: 因此,某些聊天程序会限制每次发送(即每次用户按下发送)可以发送的文本数量,所以问题归结为是否有正当理由,如果是,那是什么?
【问题讨论】:
我不知道您的实际应用程序是什么,但是,对客户端可以发送的数据总量设置硬性限制可能有助于减少您遭受拒绝服务攻击的风险,例如客户端连接并发送 100MB 的数据,这可能会导致您的应用程序无法接受。
但这真的取决于你的应用程序是什么。您是在追求每条线路的限制还是每个连接的总数限制或什么?
【讨论】:
您很可能已经看过防止“额外”传入数据的代码。这通常是由于缓冲区溢出的可能性,其中复制到内存中的额外数据超出了预分配的数组并用攻击者代码覆盖了可执行代码。用 C 等语言编写的代码通常会进行大量长度检查以防止此类攻击。 get 和 strcpy 等函数被替换为 fgets 和 strncpy 等更安全的对应函数,它们具有长度参数以防止缓冲区溢出。
如果您使用 Python 之类的动态语言,您的数组会调整大小,这样它们就不会溢出和破坏其他内存,但您仍然必须小心清理外部数据。
聊天程序可能会出于数据库字段大小等原因限制消息的大小。如果 80% 的传入消息不超过 40 个字符,90% 不超过 60 个字符,98% 不超过 80 个字符,为什么要让消息文本字段每条消息允许 10k 个字符?
【讨论】:
你的问题到底是什么?
当您在套接字上接收时,会立即返回套接字缓冲区中的当前可用数据。如果您给接收(或读取,我猜)一个巨大的缓冲区大小,例如 40000,它可能永远不会一次返回那么多数据。如果你给它一个很小的缓冲区大小,比如 100,那么它会立即返回它拥有的 100 个字节,并且仍然有更多可用的字节。无论哪种方式,您都不会限制客户端向您发送的数据量。
【讨论】: