在一个范围内创建一个整数。
safeint的Python项目详细描述
在给定范围内构造整数以防止DoS攻击。
从Internet提取数据并将其提供给Python的内置int函数会使您面临潜在的DoS攻击。python支持任意精度整数。与其他语言(如C++、Java或JavaScript)不同,它最终会溢出,Python可以表示任何要存储的内存号。例如,在以下代码中:
s = '9' * 1000000 # Generate a string with one million 9s i = int(s)
python一直在运行,在7秒的cpu工作和400kb的ram之后,它将向i填充10^1000000-1。7秒,在此期间,基于gevent的web服务器无法执行上下文切换和服务其他请求。一台在有线调制解调器上运行几百个greenlet的机器就足以破坏一个带有接受整数的api的web服务器。
safeint.int是int的替换项,用于帮助解析来自Internet的不受信任的数据。你这样使用它:
import safeint def my_controller(): foo = safeint.int(bottle.request.query.foo)
默认情况下,如果输入字符串太长,safeint.int将引发valueerror。默认值是10位数,但您可以根据应用程序的需要,使用关键字参数位数来提高或降低该值。例如,safeint.int(foo,digits=2)将您限制为-9到99范围内的数字。
除了int通常支持的功能外,safeint.int还支持一些额外的参数和功能。如果您不传递它或传递一个空字符串,它将返回none,从而避免了编写如下代码的麻烦:
if bottle.request.query.foo is None: foo = None else: foo = int(bottle.request.query.foo)
相反,您可以这样写:
import safeint foo = safe.int(bottle.request.query.foo)
int还有一些语法糖,可以在强制边界时节省时间。而不是写这个:
import safeint foo = safeint.int(bottle.request.query.foo) if foo > high: raise ValueError(...) elif foo < low: raise ValueError(...)
你可以这样写:
import safeint foo = safeint.int(bottle.request.query.foo, low=low, high=high)
开发
欢迎使用错误报告和拉取请求!