因为之前运用 django框架不规范的开发,写了一堆web漏洞,之后学习了一波web安全开发,做一个学习笔记。下面就针对这些常用问题做一些总结。都是基础,大神勿喷。
sql注入 虽然现在很多直接运用ORM映射到数据库,这一块问题不大。但是在处理大数据多表联合查询的时候速度不如原生sql语句快,运用了mysqldb的库,导致会有危险。但是也有应对办法。
图1 图2 两个是有差别的,图二可以直接把单引号转义掉。第二种办法,在进入sql语句前,先进行一波正则匹配。比如对数字进行int—>str—>int 强转,对一些敏感字符,例如select,> ,<,进行筛选。对字数进行限制等。
host头验证 漏洞检查,f12抓包,修改Host字段值,发送,查看响应中是否包含修改后的Host字段值。解决办法,使用django.http.HttpRequest.get_host() 可以获取到host,有伪造的话直接报错了,如果直接访问request.META则没有这效果。 跨站点脚本攻击XSS 为了搜集用户信息,攻击者通常会在有漏洞的程序中插入 JavaScript、VBScript、 ActiveX或Flash以欺骗用户。一旦得手,他们可以盗取用户帐户,修改用户设置,盗取/污染cookie,做虚假广告等。大致分为三步,.HTML注入。需要向web页面注入恶意代码;第二,这些恶意代码能够被浏览器成功的执行;解决办法,第一,在表单提交或者url参数传递前,对需要的参数进行过滤;第二,在后台对从数据库获取的字符串数据进行过滤,判断关键字。第三, django框架内部机制默认阻止了。它会判定传入的字符串是不安全的,就不会渲染而以字符串的形式显示。所以写了safe,要严谨。 csrf跨站请求伪造 举个例子,你点了A网站的前端,却对B网站的后端进行操作,比如转账啥的。因为A网站盗取了之前B的cookie,然后让B后端误认为是自己人。解决办法,django自带中间件保护。
第二,使用jwt进行验证。每次交互都增加jwt,退出后jwt加入redis的jwt的黑名单,jwt自带过期。
文件上传 文件上传漏洞通常由于网页代码中的文件上传路径变量过滤不严造成的,如果文件上传功能实现代码没有严格限制用户上传的文件后缀以及文件类型,攻击者可通过 Web 访问的目录上传任意文件,包括网站后门文件(webshell),进而远程控制网站服务器。解决办法,第一,进行路径,不向前端战术目录路径,第二,对后缀名进行过滤,第三,对文件大小进行判断。 越权操作 攻击者绕过前端直接发包,更改用户信息进行窥探数据库甚至对数据库进行恶意攻击。解决办法,所有的数据都进行用户权限校验,对数据进行用户校验,用户数据来源于jwt,使用后端和脚本交互增加公私钥(RSA)(虽然也不太安全但是好过没有)。 总结语 网站就像人体,前端防护就好似皮肤,皮肤并不可靠,免疫细胞强大才是真的强大(一切输入都是不可靠的,做好严格过滤。)
python培训班:http://www.baizhiedu.com/python2019
由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,雷神众测以及文章作者不为此承担任何责任。
雷神众测拥有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经雷神众测允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。
注释:本文内容来自公众号雷神众测