数据校验

第十节:进一步扩展两种安全校验方式

依然范特西╮ 提交于 2020-02-28 13:55:38
一. 简介 简介: 上一节中,主要介绍了JWT校验,它是无状态的,是基于Token校验的一种升级,它适用的范围很广泛,APP、JS前端、后台等等客户端调用服务器端的校验。本节补充几种后台接口的校验方式,它主要适用于后台代码的调用,不适合JS、APP等客户端直接调用。   PS:在一些对接一些银行接口或者一些支付接口,通常会提到这么几个名词:   (1). 根据参数名正序排序、根据参数名的ASCII码排序。   (2). appKey和appSecret,通常appKey是要当做参数进行传递,appSecret用于Sign值的计算(通常拼接后用MD5加密),有的让你 MD5(拼接参数),然后再和appSecret拼接一块,有的直接吧appSecret和其它参数按照一定规则直接拼接,最后进行MD5加密。 1. 根据参数名正序排序 eg:参数名分别为appKey、abp、userName、userPwd,排序先根据首字母排序,首字母相同,看第二个字母,依次类推,所以排序的结果为:abp、appkey、userName、userPwd,我们最终想拼接的字符串的形式为:【abp=hh&appkey=hh&userName=hh&userPwd=hh】 代码分享: 借助orderBy和Select可以实现正序排序,然后利用Join方法进行拼接 1 [HttpGet] 2 public

理解浏览器缓存

寵の児 提交于 2020-02-28 11:15:31
缓存是一种将数据保存在本地,在下一次需要使用它时,无需从数据的源头而是直接本地读取的一种技术。在http中,缓存是非常重要的组成部分。 意义 http 是一种 请求->响应 的半双工通讯协议,网页的 html 文档以及内部的每一张图片、javascript 脚本文本、css 样式文件等资源都需要向服务器发出请求,然后得到所需资源的响应。 如果没有浏览器缓存 从向服务器发起 TCP 连接请求,到服务器磁盘 IO,计算到响应传输整个过程,对网络带宽,服务器性能都是不小的考验。而一个页面往往会有少则十几,多则几十上百的请求,如果每一个资源都从服务端获取,在并发的情况下会给服务器带来很大的压力。 加入缓存后,如果客户端没有资源,会从服务端获取,取得资源后同时存在本地。下一次请求时如果有有效缓存则取缓存,由于不会向服务器发起请求,可以减少服务器的压力,同时从本地读取,不会占用网络带宽,速度也是极快的。 那么 HTTP 协议是怎么控制缓存的呢? 缓存前提 资源标志 浏览器会把请求的类型 Method (通常来说我们只缓存 get 的请求)和 URI 完整地址作为一个资源的标志。 例如下面这些浏览器都会认为是不同资源,后者并不会匹配前者的缓存。 https://xxxx/a.js 和 http://xxxx/a.js http://xxxx/a.js 和 http://yyyy/a.js

SpringBoot-03-yaml、JSR303校验、多环境配置

醉酒当歌 提交于 2020-02-28 07:40:03
1、配置文件 配置文件   SpringBoot使用一个全局的配置文件 , 配置文件名称是固定的 application.properties 语法结构 : key=value application.yaml 语法结构 :key: 空格 value 配置文件的作用 :修改SpringBoot自动配置的默认值,因为SpringBoot在底层都给我们自动配置好了; 1.1、yaml语法   YAML是 “YAML Ain’t a Markup Language” (YAML不是一种置标语言)的递归缩写。    yaml最大的优势是能够进行 复杂类型封装 , 使用@value就不支持 #对象、Map(键值对) person : age : 16 tel : 123456 name : lucius #行内写法 #person : { name : qinjiang , age : 3 } #数组 List Set pets : - cat - dog - pig #行内写法 #pets : [ cat , dog , pig ] #占位符引用其他属性的值,如果不存在可以设置默认值 person : age : $ { random . int } 、$ { random . long } 、$ { random . int ( 10 ) } tel : 123456 name : $

单点登录原理与简单实现

◇◆丶佛笑我妖孽 提交于 2020-02-27 05:38:56
一、单系统登录机制 1、http无状态协议   web应用采用browser/server架构,http作为通信协议。http是无状态协议,浏览器的每一次请求,服务器会独立处理,不与之前或之后的请求产生关联,这个过程用下图说明,三次请求/响应对之间没有任何联系   但这也同时意味着,任何用户都能通过浏览器访问服务器资源,如果想保护服务器的某些资源,必须限制浏览器请求;要限制浏览器请求,必须鉴别浏览器请求,响应合法请求,忽略非法请求;要鉴别浏览器请求,必须清楚浏览器请求状态。既然http协议无状态,那就让服务器和浏览器共同维护一个状态吧!这就是会话机制 2、会话机制   浏览器第一次请求服务器,服务器创建一个会话,并将会话的id作为响应的一部分发送给浏览器,浏览器存储会话id,并在后续第二次和第三次请求中带上会话id,服务器取得请求中的会话id就知道是不是同一个用户了,这个过程用下图说明,后续请求与第一次请求产生了关联   服务器在内存中保存会话对象,浏览器怎么保存会话id呢?你可能会想到两种方式 1 2 请求参数 cookie   将会话id作为每一个请求的参数,服务器接收请求自然能解析参数获得会话id,并借此判断是否来自同一会话,很明显,这种方式不靠谱。那就浏览器自己来维护这个会话id吧,每次发送http请求时浏览器自动发送会话id,cookie机制正好用来做这件事

单点登录原理与简单实现

只谈情不闲聊 提交于 2020-02-27 05:35:49
一、单系统登录机制 1、http无状态协议 web应用采用browser/server架构,http作为通信协议。http是无状态协议,浏览器的每一次请求,服务器会独立处理,不与之前或之后的请求产生关联,这个过程用下图说明,三次请求/响应对之间没有任何联系 但这也同时意味着,任何用户都能通过浏览器访问服务器资源,如果想保护服务器的某些资源,必须限制浏览器请求;要限制浏览器请求,必须鉴别浏览器请求,响应合法请求,忽略非法请求;要鉴别浏览器请求,必须清楚浏览器请求状态。既然http协议无状态,那就让服务器和浏览器共同维护一个状态吧!这就是会话机制 2、会话机制 浏览器第一次请求服务器,服务器创建一个会话,并将会话的id作为响应的一部分发送给浏览器,浏览器存储会话id,并在后续第二次和第三次请求中带上会话id,服务器取得请求中的会话id就知道是不是同一个用户了,这个过程用下图说明,后续请求与第一次请求产生了关联 服务器在内存中保存会话对象,浏览器怎么保存会话id呢?你可能会想到两种方式: 请求参数 cookie 将会话id作为每一个请求的参数,服务器接收请求自然能解析参数获得会话id,并借此判断是否来自同一会话,很明显,这种方式不靠谱。那就浏览器自己来维护这个会话id吧,每次发送http请求时浏览器自动发送会话id,cookie机制正好用来做这件事

多图预警——从 RAID 到分布式系统中的副本分布

末鹿安然 提交于 2020-02-26 08:27:54
原文首发于个人博客「 tobe的呓语 」欢迎大家的访问收藏啊~ 我们知道,在面对大规模数据的计算和存储时,有两种处理思路: 垂直扩展(scale up) :通过升级 单机 的硬件,如 CPU、内存、磁盘等,提高计算机的处理能力。 水平扩展(scale out) :通过添加 更多的机器 到分布式系统中,提高整个系统的处理能力。 在分布式技术尚未成熟的时候,小型机、中型机、大型机、超级计算机逐步升级的方案几乎是大型公司的唯一选择,但是这种垂直扩展是有天花板的,硬件升级的速度远远比不上数据规模的增速,即使是超级计算机也无法满足人们对计算资源的需求。 水平扩展方案,也就是在一个系统里不断添加机器的方案,就这么走上了历史舞台。这就是现在的分布式技术。 在这篇文章里,我将分别介绍单机系统下的 RAID 存储技术以及分布式系统下的存储分布技术,这两种技术在思想上有很相近的地方,希望读者慢慢体会。 RAID RAID,全称是 Redundant Array of Inexpensive/Independent Disks ,也就是磁盘冗余阵列,这里的 I 有两种说法,一种是 Inexpensive, 廉价 ,另一种是Independent , 独立 。所谓 RAID 就是将多块磁盘组合在一起,对外 抽象 成一个 容量大 , 读写速度高 , 容错性好 的大型磁盘。 我很喜欢「抽象」这个概念

如何设计一个安全的对外接口?

南楼画角 提交于 2020-02-26 04:52:46
前言 最近有个项目需要对外提供一个接口,提供公网域名进行访问,而且接口和交易订单有关,所以安全性很重要;这里整理了一下常用的一些安全措施以及具体如何去实现。 安全措施 个人觉得安全措施大体来看主要在两个方面,一方面就是如何保证数据在传输过程中的安全性,另一个方面是数据已经到达服务器端,服务器端如何识别数据,如何不被攻击;下面具体看看都有哪些安全措施。 1.数据加密 我们知道数据在传输过程中是很容易被抓包的,如果直接传输比如通过http协议,那么用户传输的数据可以被任何人获取;所以必须对数据加密,常见的做法对关键字段加密比如用户密码直接通过md5加密;现在主流的做法是使用https协议,在http和tcp之间添加一层加密层(SSL层),这一层负责数据的加密和解密; 2.数据加签 数据加签就是由发送者产生一段无法伪造的一段数字串,来保证数据在传输过程中不被篡改;你可能会问数据如果已经通过https加密了,还有必要进行加签吗?数据在传输过程中经过加密,理论上就算被抓包,也无法对数据进行篡改;但是我们要知道加密的部分其实只是在外网,现在很多服务在内网中都需要经过很多服务跳转,所以这里的加签可以防止内网中数据被篡改; 3.时间戳机制 数据是很容易被抓包的,但是经过如上的加密,加签处理,就算拿到数据也不能看到真实的数据;但是有不法者不关心真实的数据,而是直接拿到抓取的数据包进行恶意请求

数据校验

社会主义新天地 提交于 2020-02-26 03:47:19
数据校验 1、 用execute()方法实现数据校验 继承自ActionSupport类,重写execute() 2、 用validate()方法实现数据校验 继承ActionSupport类,该类实现了Validateable接口,该接口中定义了一个validate()方法,在自定义的Action类中重写validate()方法,如果校验表单输入域出现错误,则将错误添加到ActionSupport类的fieldErrors域中,然后通过OGNL表达式负责输出。 3、 用validateXxx()方法实现数据校验 在validate()方法中对数据验证是可以工作的,如果在字段非常多的情况下,而且每个字段又有很复杂的验证,那么我们的validate方法中的代码会越来越多。 针对特定的方法输入的数据的验证我们把他放到validateXxx方法中,Xxx是方法名的首字母大写形式 4、 用struts2的验证框架实现数据校验 ① 为什么要用验证框架: 当验证规则比较复杂时,Action类的代码将变得很繁琐,假如我们要对电话号码的格式进行验证,是非常麻烦的 ②验证框架的优点: Struts2中内置了一个验证框架,将常用的验证规则进行了编码实现,使用验证框架时,用户无需再进行编码,只要在外部配置文件中指定某个字段需要进行的验证类型,并提供出错误信息即可,从而大大减轻了开发者的负担,提高开发效率

JWT什么鬼?django中使用JWT

风格不统一 提交于 2020-02-25 00:55:10
JWT认证校验首选 1.pyJWT简述 因http协议本身为无状态,这样每次用户发出请求,我们并不能区分是哪个用户发出的请求,这样我们可以通过保存cookie以便于识别是哪个用户发来的请求,传统凡事基于session认证。但是这种认证本身很多缺陷,扩展性差,CSRF等问题。JWT(Json web token) 相比传统token,设计更为紧凑且安全。通过JWT可以实现用户认证等操作。 pyJWT下载 pip install pyJWT JWT构成: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsInR5cGUiOiJqd3QifQ.eyJ1c2VybmFtZSI6InhqayIsImV4cCI6MTU4MjU0MjAxN30.oHdfcsUftJJob66e5mL1jLRpJwiG0i9MOD5gzM476eY jwt是由三段信息构成,将3部分信息构成JWT字符串,通过点进行分割,第一部分称为头部(header),第二部分称为在和(payload类似于飞机上承载的物品),第三部分是签证(signature)。 header jwt的头部承载两部分:声明类型,声明加密算法 headers = { "type":"jwt", "alg":"HS256" } 然后将头部进行base64加密。(该加密是可以对称解密的),构成了第一部分

JavaScript的案例(数据校验,js轮播图,页面定时弹窗)

拥有回忆 提交于 2020-02-24 02:55:56
1.数据校验 步骤 1.确定事件(onsubmit)并绑定一个函数 2.书写这个函数,获取数据,并绑定id 3.对用户输入数据进行判断 4.数据合法,让表单提交,非法不让表单提交 如何控制表单提交:onsubmit用于提交的位置,定义函数是给出一个返回值 onsubmit=return checkform() <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script type="text/javascript"> function checkForm(){ var uValue=document.getElementById("username").value; if(uValue==""){ document.getElementById("remind").innerHTML="用户名不能为空                    "; return false; } var pValue=document.getElementById("password").value; if(pValue==""){ alert("密码不能为空"); return false; } var eValue=document.getElementById("email".value); if(!/^