企业多站点登录注册方案

企业多站点登录注册方案

前言:在单域名下,我们使用同域名下的SessionId即可实现,但是在多域名的情况下,这是行不通的

1、登录注册实现

常规的登录注册非常简单,一个登录页面、一个注册页面,通过表单提交用户输入的数据到服务端,服务端再和数据库一起做数据检验即可,又不是不能用。。。

  • login.html
  • register.html
  • login.php
  • register.php

这种方案虽然能用,但就是个弟弟的级别,也就是个玩具,在日益复杂的互联网下,各种攻击都得小心防范啊。

首要的攻击就是注册机,这个玩意会疯狂注册无效的用户,薅羊毛首选,为了阻止它,我们引入验证码,验证码于服务端生成,发送给客户端,并以图像格式显示,这样就避免了90%的羊毛党,但是高端羊毛党小小验证码是挡不住的,轻易就可以被破解,怎么办呢,这次我们引入一种人机验证,然后我们再结合手机号、短信验证码一举击溃羊毛党。

随着互联网的发展,用户越来越懒,不想输入过多信息怎么办,使用第三方快捷注册,代表的有QQ、微信、微博

2、攻击方式

这里咱们插入一个话题,几种常见的攻击方式:

攻击方式 原理 解决办法
XSS跨站脚本攻击 恶意攻击者往Web页面里插入恶意可执行网页脚本代码 做好数据验证和编码
SQL注入 程序没有有效的转义过滤用户的输入 加入预处理和数据验证
DDoS分布式拒绝服务 造成资源过载,导致服务不可用 使用第三方安全平台
CSRF跨站请求伪造 攻击者可以盗用你的登陆信息,以你的身份模拟发送各种请求 表单隐藏token,额外cookie

3、session与cookie

一般我们登录过一个网站,浏览完之后关闭它,当再打开网站时我们不用输入账号密码发现还是登录状态,这是怎么回事呢?

因为前一次登录时,服务器发送了包含登录凭据(用户名加密码的某种加密形式)的Cookie到用户的硬盘上。第二次登录时,如果该Cookie尚未到期,浏览器会发送该Cookie,服务器验证凭据,于是不必输入用户名和密码就让用户登录了。

在每一个成功的请求中,Cookie中都保存有服务器端用户所具有的身份证明(PHP中的session id)或者更为完整的数据。

  1. Session ID用来辨识来自谁的请求
  2. Cookie中存有加密的登录凭据
  3. 登录成功
1
2
3
// 开启session会产生一个Session ID,并存储在cookie中
session_start();
var_dump($_COOKIE['PHPSESSID']); // 2ij642glsstbfrkg5f55apnnem

4、微信小程序登录注册流程

  1. 尝试登录,前端通过wx.login()拿到临时code,后端请求code2Session接口,如果返回参数存在session_key,说明有效,而且只有绑定公众号才有unionid
  2. 利用unionid获取用户数据,存在则登录成功,不存在则是新用户,前往注册
  3. 前端调用<button>来获取encryptedData和iv,后端通过注册接口拿到参数后进行解密,即可用拿到手机号
  4. 利用手机号进行注册,同时填充必要信息
  5. 发送代金券
  6. 发送短信
  7. 注册统计

5、sso

多系统应用群中登录一个系统,便可在其他所有系统中得到授权而无需再次登录