讨论PythonWeb开发中可能会遇到的安全问题之SQL注入
前言
好久没写文章了,最近一直都是在看文章。
近期写了好几个PythonWeb项目,在实现需求的过程中,一直在思考PythonWeb开发过程中会遇到哪些常见的Web安全问题呢?这些问题又在什么情况下会被利用者GetShell呢?下面就分类来讨论这些问题:(这也是重新启用博客的第一篇文章,顺便投给90Sec也不知道能不能过QAQ。)
常见漏洞分析
SQLI
SQL注入所产生的条件是用户输入可构造sql语句并带入数据库执行。在Web应用中,容易产生SQL注入的输入一般是GET或POST请求参数。在PythonWeb开发中,以Flask框架为例,Flask里获取GET或POST请求数据的方式分别是request.args.get('id', 0, type=int)
和request.form.get('id', 0, type=int)
两种方式,另外Flask还支持在URL路由里带入变量:@app.route('/news/<int:id>')
,当程序员定义了这样的URL,则id这个变量在该视图里就是可以调用的。两种方法获取都是可以限定参数的类型,前者如果程序指定type为int,当用户传入无法转换成整形的字符串时,就返回None(若指定了默认值则为默认值,例子的默认值为0),后者出现这种情况则直接返回404.
PythonWeb开发中,在处理数据库的过程中经常使用orm库进行数据库处理,orm库是防SQL注入的好手。Flask和Tornado经常使用Sqlalchemy,而Django有自己自带的orm引擎。举一个用Sqlalchemy建模型类,并使用模型类查询用户数据的例子:
1 | from sqlalchemy import create_engine |