我正在实现简单的套接字编程,用于计算Post-Fix
操作。它只是计算单个操作,例如“1044 900 -
”“30 6/
”等。 (到目前为止它可以计算更复杂的后修复)
有四个运算符:加
、减
、多个
、除
我正在非常谨慎地对服务器和客户端进行编程。问题是...我们如何对整数的大小施加(重要的)限制?关于 Python 中计算单个操作的限制我们应该了解什么?
我的想法: 我猜想 python 句柄会自动与 C 不同,因为 python 很好。那么我们就不用担心这个问题了吗?
最佳答案
由于防御性编程不仅仅是限制数字大小,因此我扩展了我的答案以反射(reflect)我认为重要的更多方面。
保护您的环境。即使在开始编写服务器之前,也要决定谁可以使用该应用程序以及如何摆脱恶意用户。验证? (IP) 禁止名单? (IP)白名单?防火墙规则? VPN?
控制缓冲区 - 有明确的上限。当前传输是否大于N字节?丢弃它,然后向客户端报告错误,并可能断开连接。这适用于两个方向 - 攻击者可能会尝试向您传递一个 10 Gb 的表达式,以及向您传递一个计算时权重为 10 Gb 的表达式。
如果您有这些,这也适用于输入/输出队列 - 如果您已经有很多工作要做,请停止接受更多表达式。
如果你采取全面防御 - 每一 block 动态分配的内存都必须有一个限制。 Python 也有整数。有趣的事实 - 根据 NASA 文档,好奇号漫游车的软件中没有(或至少不应该)有任何动态分配的内存。
采用简单的应用程序协议(protocol)。这意味着拒绝接受任何东西pickled或准备好-eval
。常见格式也有其漏洞 - 在继续操作之前请咨询 OWASP,并使用可防御已知攻击的受信任库(例如,请参阅此 wiki page 关于十亿笑声 XML)。
您可以将二进制协议(protocol)与 struct
模块结合使用,自然地将数字的大小限制为 4 字节、8 字节或其他任意限制。
控制您的调用堆栈。不要使用递归(无论出于何种原因您认为需要它),这样您自然就可以避免处理调用堆栈问题。不要让堆栈深度成为程序输入的函数。
控制您的计算资源。确保控制运行中并发计算的数量。确保计算可以超时。确保程序不会挂起机器。确保您没有处理巨大的数字 - 如果表达式足够复杂,您的程序应该尝试尽早丢弃表达式。
举例说明。当给定 2 65536 pow 65536 pow 65536 pow 65536
输入时,您的服务器会如何表现?两个N位整数之和最多占用N+1位。两个 N 位整数的乘积最多占用 2N 位内存。您可以使用这些规则来预测结果大小何时变得 Not Acceptable 。
制定恢复策略。毕竟,如果您的应用程序或服务器发生故障 - 您如何以及在什么情况下可以帮助应用程序重新运行而无需手动干预?当需要手动干预时可以通知您吗?
关于python - 如何对整数的大小施加(重要的)限制? (Python),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48778299/