Python安全编码与代码审计(1)
1 前言
现在一般的web开发框架安全已经做的挺好的了,比如大家常用的django,但是一些不规范的开发方法还是会导致一些常用的安全成绩,下面就针对这些常用成绩做一些总结。代码审计准备部分见《php代码审计》,这篇文档主要讲述各种常用错误场景,基本上都是咱们自己的开发人员犯的错误,敏感信息已经去除。
2 XSS
未对输入和输出做过滤,场景:
def xss_test(request): name = request.GET['name'] return HttpResponse('hello %s' %(name))
在代码中一搜,发现有大量地方应用,比较准确的应用方法如下:
def xss_test(request): name = request.GET['name'] #return HttpResponse('hello %s' %(name))
return render_to_response(‘hello.html’, {‘name’:name})
更好的就是对输入做限制,比如说一个正则范围,输出应用准确的api或者做好过滤。
3 CSRF
对系统中一些重要的操作要做CSRF防护,比如登录,关机,扫描等。django 提供CSRF中间件django.middleware.csrf.CsrfViewMiddleware,写入到settings.py的中间件即可。另外再在函数前加上@csrf_exempt修饰器。
4 下令注入
审计代码过程中发现了一些编写代码的不好的习惯,体现最严重的就是在下令注入方面,本来python自身的一些函数库就能完成的功能,偏偏要调用os.system来通过shell 下令执行来完成,老实说最烦这种写代码的啦。下面举个简单的例子:
def myserve(request, filename, dirname): re = serve(request=request,path=filename,document_root=dirname,show_indexes=True) filestr='authExport.dat' re['Content-Disposition'] = 'attachment; filename="' + urlquote(filestr) +'"'fullname=os.path.join(dirname,filename) os.system('sudo rm -f %s'%fullname) return re
很显然这段代码是存在成绩的,因为fullname是用户可控的。准确的做法是不应用os.system接口,改成python自有的库函数,这样就能避免下令注入。python的三种删除文件方法:
(1)shutil.rmtree 删除一个文件夹及所有文件
(2)os.rmdir 删除一个空目录
(3)os.remove,unlink 删除一个文件
应用了上述接口之后还得注意不能穿越目录,不然整个系统都有可能被删除了。常见的存在下令执行风险的函数如下:
os.system,os.popen,os.spaw*,os.exec*,os.open,os.popen*,commands.call,commands.getoutput,Popen*
推荐应用subprocess模块,同时确保shell=True未设置,否则也是存在注入风险的。
第 1 页: |
转载自:https://netsecurity.51cto.com/art/201507/486944.htm
声明: 除非转自他站(如有侵权,请联系处理)外,本文采用 BY-NC-SA 协议进行授权 | 嗅谱网
转载请注明:转自《Python安全编码与代码审计(1)》
本文地址:http://www.xiupu.net/archives-4419.html
关注公众号:
微信赞赏
支付宝赞赏