如何对整数的大小施加(非平凡的)限制? (Python)
How to impose (nontrivial) limits on the size of the integer? (Python)
我正在实现计算 Post-Fix
操作的简单套接字编程。它只是计算单个操作,例如“1044 900 -
”“30 6 /
”等。 (到目前为止,它可以计算更复杂的 post-fix)
有四种运算符:add
、subtract
、multiple
、divide
我对服务器和客户端的编程非常谨慎。问题是... 我们如何对整数的大小施加(非平凡的)限制? 关于 Python 中计算单个操作的限制,我们应该了解什么?
我的想法:
我猜 python 自动处理不像 C 因为 python 很好。所以我们不需要担心?
由于防御性编程不仅仅是限制数字大小,我扩展了我的答案以反映我认为重要的更多方面。
保护您的环境。甚至在开始编写服务器之前,就决定谁可以使用该应用程序以及如何摆脱恶意用户。验证? (IP) 禁令名单? (IP) 白名单?防火墙规则? VPN?
控制您的缓冲区 - 有明确的上限。当前传输是否大于 N 个字节?丢弃它,然后向客户端报告错误并可能断开连接。这适用于两个方向——攻击者可能会尝试向您传递一个 10 Gb 的表达式,并向您传递一个在计算时权重为 10 Gb 的表达式。
这也适用于 input/output 队列,如果你有这些 - 如果你已经有很多工作要做,请停止接受更多表达式。
如果你完全防御 - 每块动态分配的内存都必须有一个限制。 Python 也是整数。有趣的事实——根据 NASA 文档,好奇号火星车在其软件中没有(或至少不应该)有任何动态分配的内存。
使用简单的应用程序协议。这意味着拒绝接受任何 pickled or ready-for-eval
. Common formats have their vulnerabilities too - consult with OWASP before proceeding and use trusted libraries that have protection against known attacks (for example, see this wiki page 关于亿万笑声 XML)。
您可以将二进制协议与 struct
模块结合使用,以自然地将数字的大小限制为 4 个字节、8 个字节或其他任意限制。
控制你的调用堆栈。不要使用递归(无论出于何种原因你认为你需要它)这样你自然会避免处理调用堆栈问题。不要让你的堆栈深度成为程序输入的函数。
控制您的计算资源。确保您控制运行中的并发计算数量。确保计算可以超时。确保程序不能挂机。确保您没有处理大量数字 - 如果表达式足够复杂,您的程序应该尽早尝试丢弃它。
举例说明。当给定 2 65536 pow 65536 pow 65536 pow 65536
输入时,您的服务器将如何表现?两个 N 位整数的和最多占用 N+1 位。两个 N 位整数的乘积最多占用 2N 位内存。您可以使用这些规则来预测结果大小在什么时候变得不可接受。
制定恢复策略。如果,毕竟,您的应用程序或服务器出现故障 - 在没有人工干预的情况下,您如何以及在什么情况下可以帮助重新制作应用程序 运行?需要人工干预时能通知您吗?
我正在实现计算 Post-Fix
操作的简单套接字编程。它只是计算单个操作,例如“1044 900 -
”“30 6 /
”等。 (到目前为止,它可以计算更复杂的 post-fix)
有四种运算符:add
、subtract
、multiple
、divide
我对服务器和客户端的编程非常谨慎。问题是... 我们如何对整数的大小施加(非平凡的)限制? 关于 Python 中计算单个操作的限制,我们应该了解什么?
我的想法: 我猜 python 自动处理不像 C 因为 python 很好。所以我们不需要担心?
由于防御性编程不仅仅是限制数字大小,我扩展了我的答案以反映我认为重要的更多方面。
保护您的环境。甚至在开始编写服务器之前,就决定谁可以使用该应用程序以及如何摆脱恶意用户。验证? (IP) 禁令名单? (IP) 白名单?防火墙规则? VPN?
控制您的缓冲区 - 有明确的上限。当前传输是否大于 N 个字节?丢弃它,然后向客户端报告错误并可能断开连接。这适用于两个方向——攻击者可能会尝试向您传递一个 10 Gb 的表达式,并向您传递一个在计算时权重为 10 Gb 的表达式。
这也适用于 input/output 队列,如果你有这些 - 如果你已经有很多工作要做,请停止接受更多表达式。
如果你完全防御 - 每块动态分配的内存都必须有一个限制。 Python 也是整数。有趣的事实——根据 NASA 文档,好奇号火星车在其软件中没有(或至少不应该)有任何动态分配的内存。
使用简单的应用程序协议。这意味着拒绝接受任何 pickled or ready-for-eval
. Common formats have their vulnerabilities too - consult with OWASP before proceeding and use trusted libraries that have protection against known attacks (for example, see this wiki page 关于亿万笑声 XML)。
您可以将二进制协议与 struct
模块结合使用,以自然地将数字的大小限制为 4 个字节、8 个字节或其他任意限制。
控制你的调用堆栈。不要使用递归(无论出于何种原因你认为你需要它)这样你自然会避免处理调用堆栈问题。不要让你的堆栈深度成为程序输入的函数。
控制您的计算资源。确保您控制运行中的并发计算数量。确保计算可以超时。确保程序不能挂机。确保您没有处理大量数字 - 如果表达式足够复杂,您的程序应该尽早尝试丢弃它。
举例说明。当给定 2 65536 pow 65536 pow 65536 pow 65536
输入时,您的服务器将如何表现?两个 N 位整数的和最多占用 N+1 位。两个 N 位整数的乘积最多占用 2N 位内存。您可以使用这些规则来预测结果大小在什么时候变得不可接受。
制定恢复策略。如果,毕竟,您的应用程序或服务器出现故障 - 在没有人工干预的情况下,您如何以及在什么情况下可以帮助重新制作应用程序 运行?需要人工干预时能通知您吗?