Python代码静态分析是一个标准化工程必不可少的一个环节,工程在上线之前需要对代码规范、语法问题进行详细的检查,防止问题随着代码发布到生产环境,避免酿成更大的故障。
这一点,在很多大型公司是非常重视的。因此,Python方面的静态检查工具层出不穷,处理经常使用的pylint
,还有除此知名公司的一些工具:
-
Google的pytype -
Microsoft的pyright -
Facebook的Pyre
虽然这些静态检查工具出自不同公司,但是核心功能如出一辙。都是基于PEP规范,去检查Python代码中的语言风格,判断是否符合编程规范,是否满足Python语法的要求,而对于更深层次的安全问题却从未涉足。
而Facebook最新开源的Pysa
则是一款专注于检测和预防Python代码中安全性问题的静态检查工具,本文就来介绍一下这款出自Facebook的Python静态检查工具。
Pysa
Pysa是一个专注于安全性的工具,它是在Facebook之前开源的静态检查工具Pyre
的基础上进行开发的。
它主要用于检查代码中的数据流问题,这一点至关重要,因为,许多安全和隐私问题都可以归结为数据流入和流出过程中产生的。
Pysa使用了一些Facebook内部框架进行开发而成,这些框架主要基于隐私策略相关技术来防止用户数据的访问和泄露,这对于一家以社交为主的公司,可以说是非常擅长。
除此之外,Pysa还可以检查常见的web应用安全问题,例如,XSS和SQL注入。
Pysa从另外一款静态检查Zoncolan汲取了很多经验,它通过数据流的追踪来检查代码的问题,判断数据是从哪里来,经过了哪些函数的处理,返回到哪个接收参数,来诊断是否有异常。
捕获问题固然重要,但是如果过度的话,就会形成误报,这当然也不是一件好事。毕竟,误报带来的成本和损失也是非常巨大的。
因此,Pysa在避免误报方面也做了很多工具。
Pysa为了避免问题的误报,通过限定追踪数据流的程度、范围已经数据源的量来避免误报。
举个例子,通过如下代码,来加载用户的资料,
# views/user.py
async def get_profile(request: HttpRequest) -> HttpResponse:
profile = load_profile(request.GET['user_id'])
...
# controller/user.py
async def load_profile(user_id: str):
user = load_user(user_id) # Loads a user safely; no SQL injection
pictures = load_pictures(user.id)
...
# model/media.py
async def load_pictures(user_id: str):
query = f"""
SELECT *
FROM pictures
WHERE user_id = {user_id}
"""
result = run_query(query)
...
# model/shared.py
async def run_query(query: str):
connection = create_sql_connection()
result = await connection.execute(query)
...
就上述代码而言,潜在的SQL注入load_pictures
是无法利用的,因为该函数只收到调用load_profile
函数而产生的user_id
有效值。如果配置正确,Pysa可能不会在此处误报问题。
现在,想象一下一个在应用程序控制器层工作的工程师,意识到使用异步,同时获取用户和图片数据会更快地返回结果:
# controller/user.py
async def load_profile(user_id: str):
user, pictures = await asyncio.gather(
load_user(user_id),
load_pictures(user_id) # no longer 'user.id'!
)
...
此更改可能看起来并无大碍,但实际上最终导致将用户控制的user_id
字符串直接连接到中的SQL注入问题load_pictures
。在入口点和数据库查询之间有很多层的大型应用程序中,这位工程师可能永远不会意识到数据是完全由用户控制的,或者SQL注入问题隐藏在所调用的功能之一中。
但是,这正是Pysa所要做的事情。Pysa可以检测到从用户控制的输入到SQL查询的数据一直在流动,并标记问题。
结语
Pysa是为了安全性问题而开发的一款静态检查工具,但是,并非所有的安全问题都可以被建模,所以,不能期望一款工具能够检测所有的安全性问题。
我个人认为,在开发过程中还是要不断培养自己的责任心和意识,提升自己对客户的敬畏之心,这样在开发过程中才能防止更多形式安全问题的出现。
推荐阅读
从zero到hero,一款Python自然语言处理效率利器!
AI开发效率倍增!让JupyterLab成为无所不能的开发神器
个人微信
欢迎各位一起讨论、一起学习,共同促进,感兴趣的可以加我个人微信。
本文分享自微信公众号 - 七步编程(CodeSteps)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
来源:oschina
链接:https://my.oschina.net/u/4596172/blog/4480567