<一>跨站点伪造请求(CSRF cross site request forgery)
什么是CSRF?攻击者盗用合法用户的身份,向服务器发送请求,对于服务器来说又是完全合法的,但却完成了攻击者所期望的操作。
完成一次CSRF攻击,受害者需要完成一下两个步骤:
1)登录受信任网站A,并在本地生成cookie
2)在不登出网站A的情况下访问危险网站B
CSRF防御
目前防御CSRF攻击有三种策略:
(1)验证 HTTP Referer 字段
HTTP的referer字段保存了http的来源地址,受访网站可以验证这个地址是否合法,如果不合法,则有可能为CSRF攻击,拒绝该请求。但这种方法不是万无一失的,referer的值是由浏览器提供的,我们并不能保证浏览器没有安全漏洞,目前已有一些方法可以篡改referer值,而且有些用户为了保护自己的隐私可以设置浏览器在发送请求时不再提供referer值。
(2)在请求地址中添加token并验证
CSRF利用cookie来进行攻击,那么我们可以在请求中添加不可伪造的信息并不存在与cookie中,可以在请求中以参数形式随机产生一个token,并在服务器建立一个拦截器验证这个token。
(3)在HTTP头中自定义属性并验证
解决了上种方法在请求中加入 token 的不便,同时,通过 XMLHttpRequest 请求的地址不会被记录到浏览器的地址栏,也不用担心 token 会透过 Referer 泄露到其他网站中去。
<二>跨站脚本攻击(XSS corss site scripting)
什么是XSS?简单来说,就是在页面中植入恶意代码。
xss通常可以分为两大类:
(1)反射型xss。出现在URL中作为参数提交到服务器,服务器解析并响应,响应结果中包含xss代码,最后浏览器解析执行。
(2)存储型xss。攻击者输入恶意的脚本数据存入数据库,当其他用户读取时,用户浏览器将解析执行这段脚本。
防御XSS攻击
坚决不要相信用户的任何输入,并过滤掉输入中的所有特殊字符。这样就能消灭绝大部分的XSS攻击。
解决办法:
1)对用户输入的数据进行过滤,比如script标签
2)保护cookie,对重要的cookie设置httpOnly,防止客服端通过document.cookie获取cookie。
<三>SQL注入
什么是SQL注入?攻击者向服务器提交恶意的sql代码,导致源程序执行包含恶意代码的sql。
防止SQL注入
1)在JAVA中使用预编译PreparedStatement;
2)对数据库特殊字符进行转义处理或编码转换;
3)在应用发布前,使用专业的sql 注入检测工具进行检测,及时发现和修补sql注入漏洞;
<四>分布式拒绝服务攻击(DDOS Distributed Denial of Service)