常见的web攻击方法及与flask的关系
本文主要介绍了XSS、SQL注入、CSRF、DDOS这四种常见的web攻击的基本概念,并列出其一般的防御方式。
而flask是一种成熟的web框架,故本文还调研并介绍了flask对这些攻击的处理方式。
XSS
概念
XSS攻击的全称为Cross Site Scripting,跨站脚本攻击。看到这里读者一定会产生疑问:为什么是XSS,而不是CSS呢?来看一下维基百科中的解释。
Cross-site scripting的英文首字母缩写本应为CSS,但因为CSS在网页设计领域已经被广泛指层叠样式表(Cascading Style Sheets),所以将Cross(意为“交叉”)改以交叉形的X做为缩写。但早期的文件还是会使用CSS表示Cross-site scripting。
原来是CSS已经有了,因此采用Cross的交叉之意而用字母X。
其攻击的核心理念是想方设法的在浏览器中执行第三方恶意脚本,以获取用户cookie等敏感信息。
一般防御方式
-
过滤script等特殊字符
-
在HTTP头中指定内容为HTML/JavaScript,避免含有攻击脚本的HTML被作为JavaScript解析。
如下图是浏览器在请求维基百科时的HTTP头,指定了内容为HTML

flask对XSS的处理
针对XSS,flask主要是对使用的模板渲染引擎Jinja2进行了配置,使其对所有可能造成攻击的字符进行转义,这样就解决了所有由模板造成的XSS问题。但除此之外的其它问题仍需flask用户自己注意。
SQL注入
概念
SQL注入就是指在输入的字符串中混入恶意SQL指令,而被数据库被认为是正常的指令执行,从而达到窃取数据库资料或破坏数据库的目的。
如最著名的例子是前端输入的用户名或密码中含有' or '1'= '1,然后后台的数据库查询语句(尖括号内为参数)为
select * from user where username='<user_name>' and password='<password>'
在实际进行查询时,查询语句就变成了
select * from user where username='hanmeimei' and password='' or '1'= '1'
然后就会将所有用户的信息读出来...是不是很可怕!
一般的防御方式
-
参数化查询
在参数化查询时,服务器不会将参数的内容作为SQL指令的一部分来处理,而是会先将SQL指令进行编译,然后再套用参数执行。
这个方法目前已被视为最有效可预防SQL注入攻击的攻击手法的防御方式。---参数化查询wiki
-
转义单引号
-
验证用户输入
flask对SQL注入的处理
flask的flask-sqlalchemy扩展对SQL语句中的引号都做了转义,但是如果在flask-sqlalchemy中使用原生语句的话还是需要注意SQL注入问题。
CSRF
概念
CSRF的全称为Cross Site Request Forgery,跨站请求伪造。攻击者会通过这种方法来利用用户的认证凭证,绕过网站的用户认证,冒充受害者进行操作,从而实现攻击的目的。
例如攻击者在a.com放了一个访问b.bank.com并执行打钱的动作,而用户之前登录过b.bank.com,浏览器中还有登录凭证,这时b.bank.com就会认为是用户想要执行打钱动作,接受了请求。
一般的防御方式
-
同源检测
可通过HTTP头的Origin和Refer字段来确定请求来源,Origin代表着请求来源域名,Refer代表请求来源地址。
通过这种方法,可以过滤掉外域的域名。
这种方法比较简单,但是相当于完全将安全交给了浏览器,并不是非常安全。而且也无法规避来自站内评论区、图片上传的攻击等。
-
CSRF Token
由于CSRF攻击者无法获取用户cookie,因此可以让用户每次访问服务器时带上一个攻击者无法获得的token,服务端再对这个token进行验证。
-
双重cookie
在用户提交表单时,带上cookie中的csrf_token字段,然后服务端验证表单中的token与cookie中的是否一致。
flask对CSRF的处理
flask自身并没有提供对CSRF的保护:
Why does Flask not do that for you? The ideal place for this to happen is the form validation framework, which does not exist in Flask.
而flask-wtf是一个flask的表单扩展,它提供了CSRF的保护,用的是上面提到的双重cookie验证。
但是目前经过简单的了解,只看到flask-wtf似乎只适用于服务器渲染的情况,如果只适用于服务器渲染的话前后端分离项目将不适用。
DDOS
概念
DOS的全称为Denial of Service,拒绝服务。前面再加个D就变成DDOS,全称为Distributed Denial of Service,分布式拒绝服务。
DDOS不是一种具体的攻击,而是一大类攻击的总称。可分为带宽消耗型及资源消耗型,以瘫痪网络及系统为目的。
常见的带宽消耗型攻击方式有:
-
UDP洪水攻击
使用大量的UDP包占满带宽。
-
ICMP洪水攻击
向未设置良好的路由器发送广播信息。
-
死亡之Ping
向目的服务器发送错误封包或恶意的ping命令。
常见的资源消耗型攻击方式有:
-
SYN泛洪攻击
SYN泛洪攻击利用了TCP三次握手的机制,攻击者只发送第一次握手信息SYN而不发送第三次,这时服务器就会挂起连接,并不断返回SYN+ACK来等待攻击ACK。当挂起的连接过多时,其资源就会耗尽。
一个常用的防御方式是降低SYN timeout的时间;其次是使用防火墙,如果重复地收到大量来自同一IP的SYN,则认为受到了攻击,并进行相应的过滤措施。
-
LAND攻击
这种方式与SYN泛洪类似,但攻击数据包的源地址和目的地址都是被攻击服务器,造成机器死循环,最终死机。
-
CC攻击
使用代理服务器向被攻击服务器发送大量的合法请求,以占用服务器资源。
-
应用程序级洪水攻击
主要出现在应用层,在应用层面进行无节制的资源申请。
一般的防御方式
-
防火墙
-
路由器
-
交换机
-
黑洞引导
将流量引入一个空接口或不存在的地址,或是有能力处理流量的服务提供商。
-
流量清洗
将流量通过DDoS流量清洗中心,区分出恶意流量和正常流量。
flask对DDoS的处理
由上面的知识可以看到,对DDoS进行防御主要是在外部的网络设备或防火墙进行,因此在flask这一层和防范DDoS无关。谷歌搜”flask DDos“也没有得到什么有价值的信息。
参考资料
Is SQL injection protection built into SQLAlchemy's ORM or Core?