zl程序教程

您现在的位置是:首页 >  其他

当前栏目

session其实并不存在,中国古代调兵遣将的虎符告诉互联网登录的秘密

2023-04-18 14:46:37 时间

如何提高技术?如何挣钱?如何同时多任务工作?如何开拓业务?如何维系一个相看两不厌的世俗关系?等等。

技术之路有很多很多,你去看一下GITHUB,可发现技术的路线多得跟米似的,又有一些自己都不会,现在流行什么语言就指什么语言,也就只能指到语言层面了。 很多人就开始绕弯路,学了几年还是没有进展。

其实,编程的技能,不花一定的时间反复练习,没有对路的师父在一旁冷眼旁观、及时棒喝,也很难领悟。有师父指路,少走三五年弯路,人生又有几个三年。

安全性验证 在课程最开始的时候,唐先生就问:我们登录之后的页面,就算不登录,知道网址也可以输入地址访问页面?有没有什么方法避免这个情况。

登录的目的就是避免非授权的访问。

开发环境: VFP SP2 7423 祺佑三层开发框架(猫框)

中国古代的虎符

古代虎符 虎符是古代皇帝调兵遣将用的兵符,用青铜或者黄金做成伏虎形状的令牌,劈为两半,其中一半交给将帅,另一半由皇帝保存。只有两个虎符同时合并使用,持符者即获得调兵遣将权。

注意有两半,一半给将帅,一半是帝王。我们BS可以不可这样做,做一个虎符,一半在服务器(S),一半在用户浏览器(B),你访问时,我验证这个虎符是不是符合,符合让你访问

登录页面的升级

<form action="login.fsp?proc=login">
    用户名:<input type="text" value="" name="username">
    密码:<input type="password" value="" name="userpwd">
    <input type="hidden" name="ispostback" value="1">
    <input type="submit" value="登录">
</form>
<%=u(cMsg)%>
  1. 增加ispostback字段,目的区分首次提交和二次及以上提交
  2. 增加错误信息提示

vfp后端代码fsp

后端代码

BS的虎符的实现

BS的虎符叫TOKEN, 为满足多人访问,且可以随时可以让TOKEN失败 我们用Guid来实现

GUID 是永不重复的字符串

  1. 验证用户名和密码服务器,生成一个GUID(token)存入表中,发送给浏览端
  2. 浏览端每次访问要往服务器提交这个GUID(token)
  3. 服务器的去验证这个GUID (token)

方法一

  1. 每次调用一个FSP(WEBPAI),往这个WEBAPI 传参
  2. WEBAPI接收这个参数,验证

方法二

  1. 登录成功之后,服务器获取GUID,存入表中,并写浏览器的COOKIE
  2. 每次调用,服务器读取Cookie 并验证

这就是所谓的Session,有些Session是放在服务器内存,有些放在数据库中,看具体实现了。

TOKEN 虎符有效期

一个Token 不能每次都能生效,我们必须给这个虎符TOKEN有效期。 验证不单单验证TOKEN是不是正确的,还要看有没有过期。

验证的时机 CTL类的init 方法

TOKEN表结构

DAL_TOKEN的设计

DAL代表数据访问类,DAL_TOKEN的类设计只有两个功能 功能一: 生成TOKEN 功能二: 验证TOKEN

生成TOKEN

验证Token

login.fsp改造

实现一个init 方法,类一旦加载,便会启动这个方法。(类默认方法)

试试效果吧

如果TOKEN 不存在,或者过期,就会出现这样的提示了

假如有班级信息,每个代码都要加上吗? 有很多FSP类, 班级 教师 学校 一个一个加很容易错,而且还容易漏掉。

不改动业务层,甚至不写代码的秘密

面向过程的程序员,在使用面向对象的语言,总是习惯把代码复制来得复制去的。觉得代码不就是这样子吗?

就没有想到面向对象就直接提升了一级思维层次。

这招可谓是降维打击!

设计父类ctl_public

父类代码

ctl_ryxx类继承ctl_public

Define Class ctl_ryxx As ctl_public OF ctl_public.prg

即可实现继承了,即由原来的session 变成了 ctl_public of 后面是PRG文件名

把原来的ctl_ryxx的中init 注释掉,试试效果吧。

以后新建的每个类都直接继承于ctl_public,即可拥有TOKEN验证的能力了。