简单总结一下日常web开发中会出现的一些安全问题,以Flask框架为例注入攻击(Injection)注入攻击主要包括系统命令注入,SQL注入,NoSQL注入,和ORM注入等,这里我们简单介绍一下SQL注入攻击原理在编写SQL语句时,如果直接将用户传入的输入作为参数使用字符串拼接的方式插入到SQL查询中的话,攻击者则可以利用SQL语句篡改,窃取数据库的信息。攻击实例@app.route(’/student’)def get_table(): password = request.args.get(‘password’) cur = db.execute(‘SELECT * FROM students WHERE password=’%s;’ % password) results = cur.fetchall() return results如果攻击者输入的值为"or 1=1–",这意味着会返回students表中的所有数据;或者输入"; drop table users; –",会删除students表中的所有数据。主要防范方法使用ORM验证输入类型转义特殊字符XSS攻击XSS(Cross-Site Scripting)即跨站脚本攻击,为了避免与CSS层叠样式表产生命名冲突,用X来表示Cross(交叉)攻击原理XSS其实是注入攻击的一种,通过将代码注入被攻击者的网站中,用户一旦访问便会执行被注入的恶意脚本。其中,XSS攻击主要分为反射型XSS攻击和存储型XSS攻击两种。攻击示例反射型XSS攻击反射型XSS又称为非持久型XSS,当某个站点存在XSS漏洞时,可以通过URL注入恶意脚本,当用户访问这个URL时,就会执行攻击脚本。@app.route(‘hello’)def hello(): name = request.args.get(’name’) response = ‘<h1>Hello, %s</h1>’ % name return response如果用户输入一段javascript代码,如访问http://example.com/hello/<script>alert(‘hahah’);</script>,客户端介绍到响应后,浏览器就会执行这段代码,当然这个示例代码不会构成任何威胁,但这意味着可以执行任意的js代码,鬼知道攻击者会做些什么!存储型XSS攻击存储型XSS也被称为持久型XSS,它和反射型XSS的行为类似,不过会把植入的恶意代码存储到数据库中,如在留言区写入一段重定向代码,这会导致用户在访问留言区页面时被重定向到一些恶意站点。防范措施HTML转义验证用户输入CSRF攻击CSRF(Cross Site Request Forgery)指跨域请求伪造,这是一种近年来才逐渐被大众了解的攻击方式。攻击原理攻击者利用用户在浏览器中保存的认证信息,向对应的站点发送伪造请求。如用户登录了A网站,认证信息保存在cookie中,当用户访问恶意网站B时,攻击者通过B网站发送一个伪造的请求提交到A网站服务器上,这会让A网站误以为请求来自于自己的网站,从而可以让攻击者成功篡改某些信息。攻击示例假设服务器端删除用户账户的视图操作为@app.route(’/account/delete’)def delete_account(): if not current_user.authenticated: abort(401) current_user.delete() return ‘deleted!‘当用户登录后,只要访问https://example.com/account/delete就会删除账户,那么在攻击者的网站上,只要创建一个显示图片的img,其中的src的属性加入删除账户的URL,当用户访问B网站时,浏览器解析网页会自动向该链接发送请求,此时你的登录信息就保存在浏览器的cookie中,因此,仅仅是访问B网站就会导致删除账户。防范措施正确使用HTTP方法CSRF令牌效验其中CSRF令牌是比较常用的方法,具体做法是在表单提交中添加一些伪随机数,即CSRF令牌(token),这里我们就不详细展开。