我正在实现计算Post-Fix
操作的简单套接字编程。它只是计算单个操作,例如" 1044 900 -
" " 30 6 /
"等等。 (到目前为止,它可以计算更复杂的后期修复)
有四个运营商:add
,subtract
,multiple
,divide
我非常谨慎地编程服务器和客户端。问题是...... 我们如何对整数的大小施加(非平凡的)限制?我们应该知道在Python中计算单个操作的限制吗?
我的想法: 我猜python句柄自动不像C,因为python很好。那么我们不需要担心它吗?
答案 0 :(得分:2)
由于防御性编程不只是限制数字大小,我扩展了我的答案,以反映我认为重要的更多方面。
保护您的环境。甚至在您开始编写服务器之前,请确定谁可以使用该应用程序以及如何摆脱恶意用户。验证? (IP)禁令列表? (IP)白名单?防火墙规则? VPN?
控制缓冲区 - 有明确的上限。当前传输是否大于N字节?丢弃它,然后向客户端报告错误并可能断开连接。这适用于两个方向 - 攻击者可能会尝试向您传递10 Gb表达式,并传递一个在计算时将加权10 Gb的表达式。
如果您有这些,这也适用于输入/输出队列 - 如果您已经有很多工作要做,请停止接受更多表达式。
如果你完全防御 - 每一块动态分配的内存都必须有限制。 Python整数也是。有趣的事实 - 根据美国宇航局的文件,好奇号流浪者不会(或至少不应该)在其软件中拥有任何动态分配的内存。
使用简单的应用程序协议。这意味着拒绝接受任何pickled或准备就绪 - eval
。常见格式也存在漏洞 - 在继续操作之前咨询OWASP并使用可防御已知攻击的受信任库(例如,请参阅此wiki page大约十亿笑的XML)。
您可以将二进制协议与struct
模块结合使用,自然地将数字大小限制为4个字节,8个字节或另一个任意限制。
控制您的调用堆栈。不要使用递归(出于任何原因,你认为你需要它),所以你自然避免处理调用堆栈问题。不要使堆栈的深度成为程序输入的函数。
控制您的计算资源。确保控制飞行中的并发计算数。确保计算可能超时。确保程序无法挂起机器。确保你没有处理大量数字 - 如果程序足够复杂,你的程序应该尽早丢弃表达式。
举例说明。给定2 65536 pow 65536 pow 65536 pow 65536
输入时,您的服务器将如何运作?两个N位整数之和占用N + 1位。两个N位整数的乘积占用高达2N位的存储器。您可以使用这些规则来预测结果大小在何时变得不可接受。
制定恢复策略。毕竟,如果您的应用程序或服务器出现故障 - 您可以在没有人工干预的情况下如何以及在何种情况下帮助使应用程序再次运行?如果需要人工干预,您会收到通知吗?