Web 安全的Secure By Default原则
(1)黑名单、白名单
(2)最小权限原则
(3)纵深防御原则
(4)数据与代码分离原则
(5)不可预测性原则
lginID 和 nickname(昵称)
一个业务安全设计得好的网站,往往loginID和nickname(昵称)是分开的。登录ID是用户的私有信息,只有用户本人能够看到;而nickname不能用于登录,但可以公开给所有人看。
什么是XSS?
跨站脚本攻击,英文全称是Cross Site Script,本来缩写为CSS,但是为了和层叠样式表(Cascading Style Sheet, CSS)有所区别,所以安全领域叫做”XSS”。
XSS攻击,通常指黑客通过“HTML注入”篡改了网页,插入了恶意的脚本,从而在用户浏览网页时,控制用户浏览器的一种攻击。(补充:在一开始,这种攻击的演示案例是跨域的,所以叫做“跨站脚本”,但是发展到今天,由于JavaScript的强大功能以及网站前端应用的复杂化,是否跨域已经不再重要。由于历史原因,XSS这个名字一直保留下来)
什么是CSRF?
跨站点请求伪造,CSRF的英文全名为Cross Site Request Forgery。
什么是注入攻击?
注入攻击是Web安全领域中一种最为常见的攻击方式。XSS本质上是一种针对HTML的注入攻击。
注入攻击的本质,是把用户输入的数据当作代码执行。需要两个条件:
(1)用户能够控制输入;
(2)原本程序要执行的代码,拼接了用户输入的数据
常见的有SQL注入,利用用户在写SQL时采用字符串拼接的语法,解决的办法是通过预编译语句,绑定变量。
MD5加密密码的小技巧
为了避免密码哈希值泄露后,黑客能够直接通过彩虹表查询出密码明文,在计算密码的哈希值时,增加一个“Salt”。“Salt”是一个字符串,它的作用是为了增加明文的复杂度,并且使得彩虹表一类的攻击失效。
Salt的使用如下:
MD5(Username+Password+Salt)
其中,Salt=abcddca… (随机字符串)
Salt应该保存在服务器端的配置文件中,并妥善保管。
Web应用中的访问控制有哪几种?
大致分为三种:
(1)基于URL的访问控制
(2)基于方法(method)的访问控制
(3)基于数据的访问控制
一般来说,“基于URL的访问控制”是最常见的,如:Java Web中通过过滤器filter实现,对每个URL进行判断。
垂直权限管理中的RBAC是什么?
RBAC:Role-Based Access Control,基于角色的访问控制。
访问控制实际上是建立用户与权限之间的对应关系。
在Java Web中推荐用Spring Security来实现RBAC模型。
Spring Security 提供两种权限管理方式:
(1)基于URL的访问控制
(2)基于method的访问控制
即Spring Security中都是验证该用户所属的角色,以决定是否授权。
具体用法见:
http://wiki.jikexueyuan.com/project/spring-security/first-experience.html
水平权限管理是什么?
水平权限管理,指的是在同一角色上,系统只能验证访问数据的角色,既没有对角色内的用户做细分,也没有对数据的子集做细分,因此缺乏一个用户到数据之间的对应关系。因此,水平权限管理又可以称之为“基于数据的访问控制”。
解决方法有两种:
(1)使用“用户组Group”的概念。比如:一个用户组的数据只属于该组内的成员,只有同一用户组的成员才能实现对这些数据的操作。
(2)实现一个规则引擎,将访问控制的规则写在配置文件中,通过规则引擎对数据的访问进行控制。
什么是DDOS?
DDOS又称为分布式拒绝攻击服务,全称是Distributed Denial of Service。
DDOS是利用合理的请求造成资源过载,导致服务不可用。
常见的网络层DDOS攻击有:SYN flood(最常见)、UDP flood、ICMP flood等。
应用层DDOS是什么?
应用层DDOS,不同于网络层DDOS,由于发生在应用层,因此TCP三次握手已经完成,发起的IP地址也是真实的。对于网络层的DDOS,现在的Anti-DDOS设备对抗效果较好,而对应用层DDOS攻击缺乏有效的对抗手段。
CC攻击,Challenge Collapasar(挑战黑洞,简称CC)。原理为:
对一些资源消耗较大的应用页面不断发起正常的请求,以达到消耗服务资源的目的。(比如:在Web应用中,查询数据库、读/写硬盘等操作,相对都会消耗较多的资源)
解决应用层的DDOS的措施?
(1)应用代码要做好性能优化。比如:合理使用memcache就是一个很好的优化方案,将数据库的压力尽可能转移到内存中。此外还需要及时地释放资源,比如及时关闭数据库连接,减少空连接等消耗。
(2)在网络架构上做好优化。比如:善于利用负载均衡分流,避免用户流量集中在单台服务器上。同时,充分利用好CDN和镜像站点的分流作用,缓解主站的压力。
(3)实现一些对抗手段(最重要)。
比如:限制某个IP地址的请求频率(通过分析网络连接、频率、地域、客户端信息,最终判断哪个请求是非法的)。思路很简单:
通过IP地址与Cookie定位到一个客户端,如果客户端的请求在一定时间内过于频繁,则对之后的客户端的所有请求都重定向到一个出错的页面。
补充:从架构上看,这段代码需要放在业务逻辑之前,才能起到保护后端应用的目的,可以看做是一个“基层”的安全模块。
上述方案存在的问题:
这个方案中有两个因素用以定位一个客户端:一个是IP地址,另一个是Cookie。但用户的IP地址可能会发生改变,而Cookie也可能会被清空,如果IP地址和Cookie同时发生了变化,那么就无法定位到同一个客户端。
补充:(1)为什么既要IP地址又要Cookie才能定位到一个客户端,因为对于局域网来说,可能会有同一个IP地址下有很多客户端,而再加上Cookie就能唯一定位到一个客户端。(2)让IP地址发生变化的做法,可以使用“代理服务器”。
针对页面中阻止自动重放行为的措施?
验证码,英文简称为CAPTCHA(Completely Automated Public Turing Test to Tell Computers and Humans Apart, 全自动区分计算机和人类的图灵测试)。
需要注意的是:
如果验证码和文件名是一一对应会存在如下缺陷:
攻击者实现采用枚举的方式,遍历所有的验证码图片,并建立验证码到明文之间的一一对应关系,从而形成一张“彩虹表”,这也会导致验证码形同虚设。
修补的方式:
验证码的文件名需要随机化,满足“不可预测性”原则。
But:
随着图像处理算法的成熟,可以将验证码变化成可识别的图片,从而直接识别出其中的文字或者字母。
改进验证码的用户体验的措施:
我们知道,验证码并非一种好的用户体验,所以应该尽量不要在用户第一次登陆时就增加验证码。
首先,需要检测到暴力破解的行为。
暴力破解通常都有一定的特征,比如:某个账户在5分钟内登陆错误达到10此。还有一种暴力破解攻击是根据若口令来遍历用户名,比如黑客使用密码“123456”,尝试登陆不同的用户名。这需要黑客事先收集一份可以使用的ID列表。
暴力破解的特征:“短时间”、“高频率”
Web Server 配置安全的几个规则:
(1)Apache以root身份或者admin身份运行是一个非常糟糕的决定。
(2)Nginx中抵抗DDOS和CC攻击方面的配置参数:
worker_processes 1;
worker_rlimit_nofile 80000;
events{
worker_connections 50000;
}
server_tokens off;
log_format IP $remote_addr;
reset_timedout_connection on;
listen xx.xx.xx.xx:80 default rcvbuf=8192 sndbuf=16384 backlog=32000
accept_filter=httpready;
(3)最小权限原则。没有必要的模块尽量不要引入。
密码取回的流程?
1、用户修改密码时,一定要提供当前密码。防止账号被盗,如Cookie挟持导致账户被盗,黑客不知道用户密码的,因此,如果修改密码不询问当前密码,是一个逻辑漏洞。
2、三个方法来认证用户
(1)用户设定的安全问题。比如:“妈妈的生日是什么什么”,答:“生我的那天”
(2)用户注册时留下的邮箱。可以通过邮箱修改密码。
(3)用户发送手机短信验证码。这需要用户预留手机信息。
3、当上述信息都不可靠时,选择用户在网站上留下过的私有信息,与用户逐一比对,以验证用户身份确实是本人。比如:用户曾经使用过的密码;用户曾经登录过的时间、地点;用户曾经在站内发表过,但又删除了的文章等。
用户账号被盗的途径?
(1)网站登录过程中无HTTPS,密码在网络中被嗅探。
(2)用户电脑中了木马,密码被键盘记录软件所获取。
(3)用户被钓鱼网站所迷惑,密码被钓鱼网站所骗取。
(4)网站某登录入口被暴力破解。
(5)网站密码取回流程存在逻辑漏洞。
(6)网站存在XSS等客户端脚本漏洞,用户账户被间接窃取。
(7)网站存在SQL注入等服务端漏洞,网站被黑客入侵导致用户账户信息泄露。
什么是钓鱼网站?
钓鱼网站:是模仿某些网站的页面,以欺骗性的域名,并通过各种文字变形诱骗用户,比如:页面中包含了登录表单的页面,此类网站的目的是骗取用户的密码。