1. token校验

登录后生成token,客户端中将token存储cookie中,服务器端将token存储与session中。后续的接口请求必须带上token,当和服务器一致则认为请求安全。

常用于客户端和服务器端的安全校验。

2. 服务器之间的sign签名校验

A服务器中用一个 key(私钥) + 时间戳 通过算法生成一个公钥,将时间戳和公钥传递给服务器B。服务器B通过同样的私钥和时间戳来生成一个公钥。如果两个公钥相同,则签名通过。

用于服务器和服务器之前的签名认证。比如支付宝,微信等接口签名下发。

3. 验证码

当部分接口可能涉及到大量的请求来攻击的时候。比如登录,注册等包含提交信息的。需要先验证验证码,当验证码通过后才会处理后续逻辑。

缺点是,每次都要输入验证码,影响用户体验。可以通过某段时间范围内,用户请求量是否超过某个阈值,当超过某个阈值后,才会出现输入验证码,否则不会出现验证码。

4. 接口请求频次限制

部分接口可能涉及到用户大量频繁的提交,但是当超过某个频次后,我们可能认为他是恶意攻击。比如聊天室,搜索接口,翻译等接口。

当某个ip或者token对接口在时间范围内有大量请求的时候,应该将该用户的ip限制,接口返回429。

5. 正确使用post,get请求方式。涉及有安全数据的,应该用post来提交。

6. 接口返回中应该将不需要的数据过滤。比如获取某个用户信息接口,如果只要用户名,就返回用户名。不要将该用户的用户名,密码,住址等私密信息返回,以便于造成泄露。

7. 使用https

8. 定时的分析接口请求日志或者nginx日志,确认是否有非法的访问,防患于未然。 你会经常发现,请求中包含各种路径,甚至包含sql语句的。根据这种请求分析自己的系统中是否存在漏洞



一、定义

正向代理是一个位于客户端和原始服务器之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。

反向代理实际运行方式是代理服务器接受网络上的连接请求。它将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给网络上请求连接的客户端,此时代理服务器对外就表现为一个服务器。

可以这么认为,对于正向代理,代理服务器和客户端处于同一个局域网内;而反向代理,代理服务器和源站则处于同一个局域网内。

二、用途

正向代理

突破访问显示:通过代理服务器,可以突破自身ip访问限制,访问国外网站等;

提高访问速度:通常代理服务器都设置一个较大的硬盘缓冲区,会将部分请求的响应保存到缓冲区中,当其他用户再访问相同的信息时,则直接由缓冲区中取出信息,传给用户,以提高访问速度;

提高客户端的安全性和性能。

反向代理

负载均衡:根据服务器的负载情况,将客户端请求分发到不同的真实服务器上,从而避免过载;

提高访问速度:反向代理服务器可以对静态内容及短时间内有大量访问请求的动态内容提供缓存服务,提高访问速度;

防止被攻击:如果网站使用反向代理,则其服务器地址是隐藏的;

缓存:反向代理服务器可以用来缓存网站内容,提高网站性能;

SSL加密:为每个用户加密和解密安全套接字层(SSL)通信对于源服务器可能无效,反向代理可以通过加密和解密所有请求来完成这项工作。

三、异同点

相同点

都起到了连接与保护的作用,正向代理和反向代理所处的位置都是客户端和真实服务器之间,所做的事情也都是把客户端的请求转发给服务器,再把服务器的响应转发给客户端。

都能提高访问速度。

不同点

正向代理是用户客户端的代理,服务器不知道真正的客户端是谁;反向代理是服务器的代理,客户端不知道真正的服务器是谁;

正向代理架设在客户机和目标主机之间,反向代理架设在网络服务器端;

正向代理主要是用来解决访问限制问题;反向代理则是提供负载均衡、安全防护等作用。

多系统的环境下,当用户一次登录获得所有系统的信任许可,而不用每个系统都需要单独登录。

登录 -> 服务器端生成token,将不同系统对应用户的token更新该token,并且设置为有效

客户端 -> 跳转不同的系统,带上该token获取系统间的信任

1、三次握手:

•1)第一次:客户端发送SYN = 1,seq = client_isn

◦作用:客户端:无,服务端:确认自己的接收功能和客户端的发送功能

•2)第二次:服务端发送SYN = 1,seq = server_isn,ACK =client_isn +1

◦作用:客户端:确认自己发送和接收都正常,确认服务端的接收和发送正常,服务端:确认自己的接收正常,确认服务端的发送正常(这时候服务端还不能确认客户端接收是否正常)

•3)第三次:客户端发送SYN = 0, ACK = server_isn+1,seq =client_isn+1

◦作用:双方确认互相的接收和发送正常,建立连接

2、四次挥手

•1)第一次:客户端发送FIN

◦作用:告诉服务端我没有数据发送了(但是还能接收数据)

•2)第二次:服务端发送ACK

◦作用:告诉客户端收到请求了,可能服务端还有数据需要发送,所以客户端收到进入FIN_WAIT状态,等服务端数据传输完之后发送FIN

•3)第三次:服务端发送FIN

◦作用:服务端告诉客户端我发送完了,可以关闭连接了。

•4)第四次:客户端发送ACK

◦作用:客户端收到FIN之后,担心服务端不知道要关闭,所以发送一个ACK,进入TIME_WAIT,等待2MSL之后如果没有收到回复,证明服务端已经关闭了,这时候客户端也关闭连接。

注意:

•当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据

•最后需要等待2MSL是因为网络是不可靠的,如果服务端没有收到最后一次ACK,服务端会重新放FIN包然后等客户端再次发送ACK包然后关闭(所以客户端最后发送ACK之后不能立即关闭连接)


什么是事务?及其特性?

事务:是一系列的数据库操作,是数据库应用的基本逻辑单位。

特性:

(1)原子性:即不可分割性,事务要么全部被执行,要么就全部不被执行。

(2)一致性或可串性。事务的执行使得数据库从一种正确状态转换成另一种正确状态

(3)隔离性。在事务正确提交之前,不允许把该事务对数据的任何改变提供给任何其他事务,

(4) 持久性。事务正确提交后,其结果将永久保存在数据库中,即使在事务提交后有了其他故障,事务的处理结果也会得到保存。

简单理解:在事务里的操作,要么全部成功,要么全部失败。

数据完整性(Data Integrity)是指数据的精确(Accuracy) 和 可靠性(Reliability)。

包括:

(1)实体完整性:规定表的每一行在表中是惟一的实体。

(2)域完整性:是指表中的列必须满足某种特定的数据类型约束,其中约束又包括取值范围、精度等规定。

(3)参照完整性:是指两个表的主关键字和外关键字的数据应一致,保证了表之间的数据的一致性,防止了数据丢失或无意义的数据在数据库中扩散。

(4) 用户定义的完整性:不同的关系数据库系统根据其应用环境的不同,往往还需要一些特殊的约束条件。用户定义的完整性即是针对某个特定关系数据库的约束条件,它反映某一具体应用必须满足的语义要求。

Oracle、SQL Server、MySQL、Sybase、DB2、Access等

使用HTTP的POST方式,对固定参数+附加参数进行数字签名,使用的是md5加密。

比如:我想通过标题获取一个信息,在客户端使用 信息标题+日期+双方约定好的一个key通过md5加密生成一个签名(sign)。

然后作为参数传递到服务器端,服务器端使用同样的方法进行校验,如何接受过来的sign和我们通过算法算的值相同,证明是一个正常的接口请求,我们才会返回相应的接口数据。

封装性

也称为信息隐藏,就是将一个类的使用和实现分开,只保留部分接口和方法与外部联系,或者说只公开了一些供开发人员使用的方法。于是开发人员只 需要关注这个类如何使用,而不用去关心其具体的实现过程,这样就能实现MVC分工合作,也能有效避免程序间相互依赖,实现代码模块间松藕合。

继承性

就是子类自动继承其父级类中的属性和方法,并可以添加新的属性和方法或者对部分属性和方法进行重写。继承增加了代码的可重用性。PHP只支持单继承,也就是说一个子类只能有一个父类

多态性

子类继承了来自父级类中的属性和方法,并对其中部分方法进行重写。于是多个子类中虽然都具有同一个方法,但是这些子类实例化的对象调用这些相同的方法后却可以获得完全不同的结果,这种技术就是多态性。多态性增强了软件的灵活性。

存储位置:session存储于服务器,cookie存储于浏览器

安全性:session安全性比cookie高

session为‘会话服务’,在使用时需要开启服务,cookie不需要开启,可以直接用

关联性:服务端生成的session会生成一个key保存在cookie中,用于保持会话

session跨服务器:session可以存储在不同的服务器之间,不同的存储系统,比如存储到数据库,redis缓存等,所以服务器端的session可以跨服务器,分布式存储