首先让我们来看看登录的一般流程:
- 输入账号密码提交给后端;
- 后端进行判断账号密码是否一致,这里的逻辑根据每个程序员的想法去写;
- 如果通过2登录成功,跳转登录成功的页面;
如果通过2登录失败,跳转重新登录的页面;
后台管理系统有很多文件,判断登录之后,进入这些文件都需要加以验证是否登录,否则登录就只起了一次作用,所以才会产生cookie和session的概念。会有这么一个专门的文件进行验证,这里面应该会用到cookie或者session,然后将这个文件在需要的地方进行调用。
首先让我们介绍一下第一位嘉宾:Cookie
- 基于身份验证;
- 储存在客户端(浏览器)‘,存在安全隐患
常见的安全危害:cookie修改/伪造/盗取
可以看到无论是cookie还是session都可以进行身份验证,只是储存的位置不一致。
下面用代码演示一下具体的过程(以PHP语言为背景进行讲解):
一个简单的登录页面:
获取提交的值,使用php进行数据库交互的代码:
假设登录成功后跳转添加页面:
失败后跳转登录页面。
但是此时有一个问题,我在不登陆的情况下,访问添加页面仍然有效,就是说我的登录没有起作用,假设这个时候添加一段代码,登陆成功后在cookie里存储东西,其他地方从cookie里面获取东西,如果获取不到,说明没有登录,如果获取到了,说明登录成功:
登录代码处:
在添加页面前面插入一段验证是否登录的代码:
一个网站里通常都有很多cookie:
我们继续回到上一个例子,当登录成功之后,cookie中的user有了值admin,当再次登录的时候,会携带这个带有user=amdin的cookie进行登录,这个时候,验证是否能够通过的代码就能通过验证:
但是仔细想,这种验证有安全缺陷,只是验证cookie,如果抓包修改了cookie的值直接是admin,那这样就可以直接登录了,这就是cookie修改伪造。那盗取又是什么意思呢?如果我登录以后,客户端就是有我登录的cookie,储存在自己的浏览器里面,别人如果用xss漏洞,通过js获取到你的cookie的值,这样就会造成权限维持的效果了,这里就不展开讲了。
另外还有session:
3. 基于身份验证
4. 存储在服务器端(服务器)
常见的安全危害:session劫持
还是采用刚才的例子:
这是判断登录的代码,这里把登录的信息存储到了session当中:
这是添加的页面,进行session验证:
这种再次请求的时候,cookie里面就不会再出现敏感值,但是存在sessionid的值,一个sessionid对应一个session,session可以理解为打电话,如果一方挂断了电话,就结束了本次通话,当第二次用另一个浏览器进行访问的时候(另外一次电话连接),sessionid就已经变了,不同的电话连接有不同的session,既然cookie可以进行cookie伪造,那session可以嘛?我们f12可以看到,sessionid的值很复杂,伪造起来会有很多的值,可能性太多,爆破很难,尽管爆破成功了,有可能对方的sessionid已经改了,一般不会产生伪造的问题。
那产生的session劫持是什么意思呢?当一直没有关闭浏览器的时候,此时获取的sessionid就是有效的,如果没有关闭浏览器,但是长时间未操作,也会导致sessionid失效,另一种情况就是关闭了浏览器,这两种情况都会导致session失效,所以攻击必须得到未失效的session,进行session劫持,以后再讲。
补充两个知识点:万能密码/验证码
- 万能密码其实就是sql注入的语句,$result是有结果的,那么session里面也会存储对应的值,那么就会登录成功。
- 验证码复用问题,验证码输入一次,重放修改账号密码,相当于就是爆破攻击了,跟没有验证码一样的。所以每次登录验证码都要变,这样才能放置爆破攻击。验证码不变,修改密码,显示密码错误,验证码可以爆破,如果显示验证码错误,就不可以爆破。一种特殊情况,简单的验证码可以使用插件直接识别,所以如何保证每次登录,验证码都会改变呢?大家思考一下吧?