- 浏览: 252699 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
runjia1987:
cpu 100%,是因为读=-1时,没有解注册OP_READ, ...
java nio网络编程的一点心得 -
two_plus:
按照你的例子 服务端变成读循环了...
java nio网络编程的一点心得 -
ilovemyyang:
我也遇到同样的空循环问题,也是百度才找到了的,楼主给力哦
java nio网络编程的一点心得 -
高攀sky:
Python发邮件 -
fobdddf:
fobdddf 写道朋友你好,我试了一下数组的那个例子,反汇编 ...
读《深入理解计算机系统》
众所周知在Python下可以用eval和exec来执行任意的python表达式及脚本,但是,当运行的脚本来自于网络时这样做就会有安全风险,你总不想运行包含"import os; os.system('rm -rf /')"的脚本吧?对这类问题,通常的解决方法是为来自网络的脚本创建一个沙箱(Sandbox),浏览器在执行来自网络的Java Applet时会创建一个权限较低的Sandbox,在其中运行的代码不能做任何威胁系统的操作,例如读取/写入本地文件,执行外部程序等。Python运行环境并不原生支持创建Sandbox,它不像java在执行危险操作会先进行权限检查,而RestrictedPython提供了一种可选的创建sandbox的方式。
RestrictedPython原理
RestrictedPython的关键在于使用compile_restricted去编译Python代码,它和内置compile差不多也是将源代码编译成exec或eval可以直接运行的AST(语法抽象树)。和compile不一样的地方在于,compile_restricted悄悄地改变地生成的AST,它将读/写属性、访问/更新字典变成可以hook的函数调用。例如,它将x.foo变成_getattr_(x, 'foo'),将x.foo = 'bar'变成_write_(x).foo = 'bar',将x['foo']变成_getitem_(x, 'foo'),x['foo'] = 'bar'变成_write_(x)['foo'] = 'bar'。通过提供你自己的_getattr_,_write_,_getitem_等函数,你可以控制运行脚本所能干的事情,即为脚本创建一个Sandbox。这种创建Sandobx方式有些类似于Java中的AspectJ,通过改变生成的java的字节码来增加类的行为。
1. 控制导入
要控制导入只需要定制__import__函数,这是python的机制,和RestrictedPython无关,如果你不需要复杂的控制,通过定制__import__,控制__builtins__导入的变量,并在globals中导入一些需要的变量或模块来实现。要实现不能导入os模块的效果,可以这样做:
输出:
上面的代码并没有使用任何RestrictedPython相关的函数。通过在_hook_import直接抛出异常可以实现不允许导入任何模块的效果,或者更直接的方式,从__builtins__直接删除__import__。RestrictedPython提供了safe_builtins字典,它去除了任何可能导致安全问题的内置函数,比如open, getattr/setattr, __import__。
输出:
2. 控制属性读取
控制属性读取需要定制_getattr_(或_getitem_),它接受两个参数,第一个参数是要访问的对象,第二个参数是访问的属性名称(或索引值)。通过这个它我们可以实现让脚本只能读取某些对象的某些属性,需要注意方法调用也是属性访问,foo.bar()会变成_getattr(foo, 'bar')()。要不让脚本访问os的name属性及调用os.system()方法,可以这样做:
输出:
定制_getitem_是类似的,不再赘述。
3. 控制属性写入
控制属性写入需要定制_write_方法,它接受单个对象,要允许对象写入任何属性,直接将原对象返回,要不允许写入任何属性(包括更新dict及list元素),直接抛出异常,如果只允许部分属性写入,则需要返回修改后的对象,在设置它的属性时做检查。RestrictedPython提供full_write_guard,它不允许修改除了dict和list之外的任何对象。
输出:
要使得只是不能修改Person的属性,则可以这样:
输出:
完。
RestrictedPython原理
RestrictedPython的关键在于使用compile_restricted去编译Python代码,它和内置compile差不多也是将源代码编译成exec或eval可以直接运行的AST(语法抽象树)。和compile不一样的地方在于,compile_restricted悄悄地改变地生成的AST,它将读/写属性、访问/更新字典变成可以hook的函数调用。例如,它将x.foo变成_getattr_(x, 'foo'),将x.foo = 'bar'变成_write_(x).foo = 'bar',将x['foo']变成_getitem_(x, 'foo'),x['foo'] = 'bar'变成_write_(x)['foo'] = 'bar'。通过提供你自己的_getattr_,_write_,_getitem_等函数,你可以控制运行脚本所能干的事情,即为脚本创建一个Sandbox。这种创建Sandobx方式有些类似于Java中的AspectJ,通过改变生成的java的字节码来增加类的行为。
1. 控制导入
要控制导入只需要定制__import__函数,这是python的机制,和RestrictedPython无关,如果你不需要复杂的控制,通过定制__import__,控制__builtins__导入的变量,并在globals中导入一些需要的变量或模块来实现。要实现不能导入os模块的效果,可以这样做:
src = ''' import os ''' _builtins = dict(__builtins__.__dict__) def _hook_import(name, *args, **kwargs): if name == 'os': # now allow to import os raise RuntimeError('cannot import os') # otherwise, use default __import__ return __import__(name, *args, **kwargs) # replace __import__ with our hook implementation _builtins['__import__'] = _hook_import _globals = { '__builtins__': _builtins, } # use builtin compile instead of compile_restricted code = compile(src, '<string>', 'exec') exec code in _globals
输出:
Traceback (most recent call last): File "sandbox.py", line 24, in <module> exec code in _globals File "<string>", line 2, in <module> File "sandbox.py", line 16, in _hook_import raise RuntimeError('cannot import os') RuntimeError: cannot import os
上面的代码并没有使用任何RestrictedPython相关的函数。通过在_hook_import直接抛出异常可以实现不允许导入任何模块的效果,或者更直接的方式,从__builtins__直接删除__import__。RestrictedPython提供了safe_builtins字典,它去除了任何可能导致安全问题的内置函数,比如open, getattr/setattr, __import__。
from RestrictedPython.Guards import safe_builtins _globals = dict(__builtins__=safe_builtins) src = '''open('/etc/passwd')''' code = compile(src, '<string>', 'exec') exec code in _globals
输出:
Traceback (most recent call last): File "sandbox.py", line 9, in <module> exec code in _globals File "<string>", line 1, in <module> NameError: name 'open' is not defined
2. 控制属性读取
控制属性读取需要定制_getattr_(或_getitem_),它接受两个参数,第一个参数是要访问的对象,第二个参数是访问的属性名称(或索引值)。通过这个它我们可以实现让脚本只能读取某些对象的某些属性,需要注意方法调用也是属性访问,foo.bar()会变成_getattr(foo, 'bar')()。要不让脚本访问os的name属性及调用os.system()方法,可以这样做:
from RestrictedPython import compile_restricted def _hook_getattr(obj, attr): import os if obj is os and attr in ('name', 'system'): raise RuntimeError('cannot invoke os.name or os.system') return getattr(obj, attr) src = ''' import os #os.name os.system('ls') ''' code = compile_restricted(src, '<string>', 'exec') _globals = { '_getattr_': _hook_getattr, } exec code in _globals
输出:
Traceback (most recent call last): File "sandbox.py", line 19, in <module> exec code in _globals File "<string>", line 4, in <module> File "sandbox.py", line 7, in _hook_getattr raise RuntimeError('cannot invoke os.name or os.system') RuntimeError: cannot invoke os.name or os.system
定制_getitem_是类似的,不再赘述。
3. 控制属性写入
控制属性写入需要定制_write_方法,它接受单个对象,要允许对象写入任何属性,直接将原对象返回,要不允许写入任何属性(包括更新dict及list元素),直接抛出异常,如果只允许部分属性写入,则需要返回修改后的对象,在设置它的属性时做检查。RestrictedPython提供full_write_guard,它不允许修改除了dict和list之外的任何对象。
from RestrictedPython import compile_restricted from RestrictedPython.Guards import full_write_guard class Person(object): name = 'marlon' src = ''' d = { } d['foo'] = 'bar' # OK l = [1, 2] l[0] = 'egg' # OK p = Person() p.name = 'john' # ERROR! ''' code = compile_restricted(src, '<string>', 'exec') _globals = { 'Person': Person, '_write_': full_write_guard, } exec code in _globals
输出:
Traceback (most recent call last): File "sandbox.py", line 22, in <module> exec code in _globals File "<string>", line 7, in <module> File "xxx/RestrictedPython/Guards.py", line 101, in handler raise TypeError, error_msg TypeError: attribute-less object (assign or del)
要使得只是不能修改Person的属性,则可以这样:
from RestrictedPython import compile_restricted class Person(object): name = 'marlon' def _hook_write(obj): if not isinstance(obj, Person): return obj else: raise RuntimeError('cannot modify person object') src = ''' p = Person() p.name = 'john' # ERROR! ''' code = compile_restricted(src, '<string>', 'exec') _globals = { 'Person': Person, '_write_': _hook_write, } exec code in _globals
输出:
Traceback (most recent call last): File "sandbox.py", line 24, in <module> exec code in _globals File "<string>", line 3, in <module> File "sandbox.py", line 12, in _hook_write raise RuntimeError('cannot modify person object') RuntimeError: cannot modify person object
完。
发表评论
-
Python模板性能评测
2011-11-28 18:00 5588本篇主要是对django, jinja ... -
Mongodb内嵌文档插入性能评测
2011-11-20 18:03 11402Mongodb作为典型的文档数据库,支持内嵌文档和复杂的查询, ... -
支持通配符的DNS代理
2011-05-05 22:23 6989hosts文件可以手动配置一些域名的IP地址,它的优先级最高, ... -
python变量覆盖陷阱
2011-04-03 21:35 3647我已经好几次碰到这样的错误了,每次碰到都花费我大量的时间,下面 ... -
在App Engine下运行Django 1.2
2011-03-20 22:12 1924我不知道App Engine是从什 ... -
实现简单的Future
2011-02-19 19:38 1611异步调用的困难之处我们不知道它什么时候会返回,通常的解决方法是 ... -
创建简单声明式python对象模型
2011-02-19 12:27 2729创建简单python声明式对象模型 要创建一个简单的Auth ... -
wxpython中工作线程与主线程交互
2011-01-15 23:56 6072在wxpython中,像其它GUI ... -
Python下Base64编码
2010-12-04 12:53 2592在Python下有Base64编码的库,可直接用,我自己写了个 ... -
Python中用MetaClass实现委托、不可变集合
2010-09-13 16:01 5316委托(delegate)是许多设计模式(如Decorator, ... -
用编程语言作数据库测试的配置
2010-09-11 11:25 1313在上一篇博客:django, mo ... -
django, mongodb与测试
2010-09-11 10:05 3309在django下很容易写测试,只需要继承DjangoTestC ... -
一个简单的Form向导实现
2010-06-20 18:42 1363Django的contrib中带了个FormWizard,但是 ... -
再一个用于调试Django模板的标签
2010-06-15 17:42 1835主要用于在Html中递归输出对象的属性,这对调试Django相 ... -
几个用于调试Django模板的标签
2010-06-15 17:18 4586Django模板有诸多限制,例如不能调用方法,不能执行任意的P ... -
探索Python下的property, classmethod, staticmethod的实现
2010-05-30 21:10 4106Python有几个内置方法poperty, classmeth ... -
Python农历公历转换
2010-04-24 17:38 2212实现中主要有两个方法,一个是get_lunar_date,它根 ... -
Python发邮件
2010-03-27 11:25 2369下面的代码的作用是将电子书作为附件发送到163邮箱。 ...
相关推荐
RestrictedPython是一种工具,可帮助定义Python语言的子集,该子集允许将程序输入提供给受信任的环境。 RestrictedPython不是沙盒系统或安全环境,但它有助于定义受信任的环境并在其中执行不受信任的代码。 警告 ...
4. **易用性**:对于开发者来说,使用Python-sandbox进行代码测试或验证非常直观,只需要将代码片段输入到沙箱环境中,即可立即查看运行结果。 **应用场景** 1. **教育**:在教学环境中,教师可以使用Python-...
SandBox是一个基于django框架开发的轻量级办公平台,主要模块有:权限控制、资产(库存)管理、设备管理、客户信息管理和工单流程管理,其目的在于建立一套规范化、统一化和清晰化的标准服务流程,能够清晰的处理、...
Python Sandbox 运行不安全的 Python 代码,比如不安全的用户输入。 这个沙箱的目标是阻止不安全的代码运行系统命令,如 os.system(" rm -rf ~") 以及对文件系统的访问。 该软件包带有 Sandbox 模块和 ...
5. **性能分析**:通过在沙箱中运行代码并使用Python内置的`timeit`模块或其他性能分析工具,开发者可以评估不同实现的效率,优化代码性能。 6. **安全编码**:在沙箱环境中,开发者可以测试可能有安全风险的代码,...
PyBox(“Python Sandbox”的缩写)是一个灵活且轻量级的过程和系统分析框架。 最初,我们开始这个项目的目的是为半自动恶意软件分析创建一个沙箱工具包,它既易于理解又易于扩展。 使用 Python 作为主要编程语言...
本项目是一个集Python、JavaScript、HTML、CSS、PHP等多语言于一体的Sandbox项目,包含2136个文件,其中包含702个JavaScript文件、327个HTML文件、251个PNG图片、221个CSS文件、134个Python源文件、122个Python编译...
Sandbox Sandbox 发 Sandbox Sandbox Sandbox
资源分类:Python库 所属语言:Python 资源全名:falcon_sandbox-1.0.0-py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
- **使用console_scripts**:说明如何利用`console_scripts`入口点类型创建命令行脚本。 - **使用插件和驱动程序**:介绍了如何通过定义`plugins`或`drivers`类型的入口点来扩展应用程序的功能。 #### 八、虚拟环境...
资源分类:Python库 所属语言:Python 使用前提:需要解压 资源全名:hackoregon_sandbox-0.1.16-py2.py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
目的 此docker设置用于tring触摸和测试一些机器学习。 已安装的主要软件 Tensorflow 1.10.0 链接器4.3.1 PyTorch 0.4.1 Keras 2.2.2 锁链机RL 0.4.0 Scikit学习0.19.2 Gensim 3.5.0 脾气暴躁的1.14.5 ...
以下是对PayPal Sandbox使用指南的详细说明: 1. **创建开发者账户**: - 首先,访问PayPal开发者网站`https://developer.paypal.com`,点击“Sign Up Now”进行注册。 - 填写必要的个人信息,包括姓名、电子邮件...
该项目的目标是使用户能够使用新发布的OpenAI GPT-3 API和几行Python创建酷炫的Web演示。 该项目解决以下问题: 自动格式化用户的输入和输出,以便模型可以有效地进行模式匹配 为用户创建一个Web应用程序以在本地...
14. **自动化任务**:可能使用Python编写了脚本,实现文件自动化处理、定时任务(如cron job)或系统监控。 15. **并发与多线程**:Python的threading模块和multiprocessing模块用于实现多线程和多进程,提升程序的...
标签为"Python",意味着这个项目是使用Python编程语言进行的。Python是一种广泛使用的高级编程语言,以其易读性、丰富的库支持和跨平台能力而闻名。它适用于各种应用场景,如Web开发、数据分析、机器学习、自动化...
**描述:** 该文档为PayPal Sandbox用户指南,旨在为专业用户提供有关如何设置和使用PayPal Sandbox环境的详细指导。文档当前仅提供英文版本,并且最后更新时间为2008年9月。 **标签:** PP_Sandbox_User_Guide.pdf...
基于Python实现的简单网格策略交易源码+使用说明.zip 策略说明 开仓:在盘口挂出买N和卖N,当你的买单或卖单完成后,再重新开启相应的仓位,保持你始终有买N和卖N的订单。 **KuCoin**拥有**level3交易数据、强大...
在 `laravel-sandbox` 中,你可以创建多个独立的“沙箱”项目,每个项目都可以视为一个微型应用,它们共享相同的底层 Laravel 实例,但拥有各自的配置、路由和模型。这样,你就可以在不同的沙箱中并行开发,同时保持...
12. **虚拟环境管理**:使用venv或virtualenv创建隔离的Python环境,便于项目依赖的管理和版本控制。 13. **包管理**:pip是Python的包管理器,用于安装、升级和卸载软件包。 14. **持续集成/持续部署(CI/CD)**:...