在一个范围内创建一个整数。

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)

开发

欢迎使用错误报告和拉取请求!

致谢

Peloton支持开源!

丹·索科斯基和亚当·德普赖斯实施这个解决方案!

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何忽略缓冲读取器中在“”之后的行的其余部分,或行上的特定字符?   java在db中创建空对象或稍后保存   java如何实现UI无关的后台工作任务   java未能在Android中从BaseAdapter扩展的类中启动Tactivity?   java斐波那契迭代移动数组[]   安卓从文件读取提供了java。木卫一。StreamCorruptedException:无效的流标头:73720027   java计算矩形中的六边形数?   仅使用Java 1.5(或更早版本)读写XML   java如果所有元素都以相同的bucked结尾,为什么要进行大小调整?   java Apache POI Excel在xx中发现无法读取的内容。xlsx   swing我可以在普通java应用程序中使用GWTGUI吗?   来自自定义Java客户端的http删除请求的行为与邮递员不同   运行批处理文件时,java当前目录无效   使用TypeReference将java字符串转换为ArrayList<STRING>   documentlistener突出显示所有匹配词Java