Web安全之浅见
昨天去参加了公司组织的一个关于网络安全的培训,了解了很多关于网络安全方面的知识,也才意识到网络安全是一项极其重要的领域。
目前网络攻击有很多种,比如比较流行的DDos攻击,它的原理主要是利用触发大量的协议上允许的请求,从而让你的服务器资源耗尽,比如SYN_FLOOD,DNS_FLOOD,还有HTTP连接的慢连接,CC等等。
SYN_FLOOD syn 洪攻击,攻击者伪造客户端不断向服务器发送建立TCP连接请求,但发送完SYNC标志位建立请求之后,不继续后续流程。服务器会不断回复ACK,导致服务器端出现了大量了半开连接,如果数量巨大,导致服务器可能无法再继续正常处理请求。缓解方式有多种。如果客户端ip不变,就比较简单了;如果是伪造的,则比较麻烦了。可以增加服务器内部半连接队列大小,可以定期删除半连接队列中最早的SYN。也可以在服务器之前设立一道墙,比如Cloudflare 。对于初始的SYN请求,不直接到达服务器,而是由Cloudflare 完成,
DNS_FLOOD,dns 洪攻击,这个是对DNS服务器的攻击,DNS服务器用来进行域名解析的,DNS攻击就会向DNS服务器发送大量的请求,导致DNS服务器无法正常进行域名解析。或者就算服务器本身可承受,但由于大量请求过来,可能导致服务器所在的网络运营商发现了流量异常超标,已经影响了整个出口带宽,运营商都会直接把你ip封掉。不知道大家听说过2009年的暴风影音事件,因为两家游戏公司恶意竞争,一个公司恶意攻击另外一家公司网站,导致DnsPod服务器受到Ddos攻击,再加上当时著名的暴风影音使用了免费的DnsPod服务器,也受到了影响,那时的暴风今非昔比,用户量巨大,导致大量域名解析请求达到了电信的DNS服务器,占用了典型机房的1/3的带宽,于是乎,被电信封掉了ip。这一封不要紧,直接导致使用DnsPod解析的网站全部无法访问,数量达到10万+。有感兴趣的可以看看历史回顾,很精彩,DnsPod创始人很厉害,叫吴洪声,作为一个大专生,靠着爱好和坚持搭建了DnsPod,现在已经被腾讯收购了,妥妥的人生赢家。
我本身是开发Web的,所以本篇文章主要就聊聊Web安全。不过我对于网络安全方面不是特别懂,所以网络安全方面的大牛们,可以忽略我的文章哈。
本文主要讲以下几种:
- XSS;
- CSRF;
- SQL注入;
一、XSS
1、原理
XSS全名是Cross Site Script,正因为叫XSS,是为了避免和前端的CSS重复。它的原理是攻击者通过向某界面插入一些恶意的脚本,使得在别人访问该页面j加载html的时候会自动执行恶意脚本,从而达到某种目的,比如窃取你的cookie啊,这是最致命的了。
我就结合我的网站来说,我现在要编辑一篇文章,然后我在正文中插入一个简单的脚本代码,如图:
当我编辑完,提交之后,假如我网站没有任何的防御机制,原封不动地将文章数据保存到数据库中。那当有一个用户要访问该文章对应的页面的时候,那这段代码就会被执行。如下:
这个简单的例子就展示了XSS攻击的思想。
2、防御
在Django中队XSS的防御还是比较完善的。我认为他是分成两部分的,一是输入,二是输出。
首先,当你输入完内容要提交的时候,它是要对你的输入字符串进行转义的。
比如你上面输入了script,它会将其转义成:
<script>alert('海波你真帅!') </script>
嗯,小样,我让你植入,去屎。
当你在执行提交事件时,Django模板会自动进行html转义,下面五个字符转义关系:
- < 会转换为 <
- > 会转换为 >
- ' (单引号) 会转换为 '
- " (双引号)会转换为 "
- & 会转换为 &
说完输入,再说输出。输出时Django默认对你加载的变量进行转义。
但说实话,有的时候我们是不需要转义,比如我的content内容本身就是富文本,在数据库中也是html啊,有各种html标签。因此这时候可以关闭自动转义。
关闭自动转移可以通过autoescape或者safe, safe是针对独立变量的,autoescape是针对整个代码块的。
{% autoescape off %}
Hello {{ name }}
Hello {{ name|escape }}
{% endautoescape %}
注意到没有,我有一个加了escape,这是说虽然对整个子模块关闭转义,但我还想对某个变量进行转义,那就用escape。
二、CSRF
我之前在我的博客中有介绍,感兴趣的可以访问: Django的CSRF介绍。
三、SQL注入
1、原理
SQL注入攻击的原理就是通过在Web表单中提交一些特殊的字符串,然后让服务器的数据库运行一些SQL语句,从而达到攻击的目的。比如获取用户信息,删除数据库数据等等。你想想,如果银行数据被获取或者篡改或者获取,是多么危险的一件事。
现在拿查询来说,一个标准的查询语句如下:
select username from auth_user where username = 'somename'
假如现在,用户在表单中输入了:' or '1'='1',那sql语句就变成:
select username from auth_user where username = '’ or '1'='1'
该语句的where恒为真,所以会获得所有用户的信息,之前据说CSDN就被爆出几百万用户信息泄露。
上面仅仅是查询,那要是delete或update就危险了,delete from where ......,我把数据都删了。
2、防御
其实现在Web对sql注入的防御已经比较完善了。就拿Django框架来说,它的保护机制还是非常给力的。
首先,Django提供了完备的表单验证机制。
对每一个你输入的字段数据,都会进行各种验证。比如用户名,你还有单引号类似的特殊字符是肯定会抛出异常的。只有你的数据都是有效的,才会执行后续的数据操作。关于更多表单字段验证的可参考我另一篇文章: Django表单验证。
其次,Django的ORM框架使得会对Django会根据你所使用的数据库服务器的转换规则,自动转义特殊的SQL参数。在《Django Book 2》中有说明:
foo.get_list(bar__exact="' OR 1=1")
Django会自动进行转义,得到如下表达:
SELECT * FROM foos WHERE bar = '\' OR 1=1'
关于Web安全的攻击还有很多,感兴趣的可以翻阅《Django Book 2》或者Django官网。
微信分享/微信扫码阅读