PHP如何安全的对外提供api
1、这个机制可以有效的防止陌生用户访问接口,如何实现这个机制呢?
1.调用接口的用户提供账号和密码(或者API KEY和 API Secret),
2.使用账号和密码(或者API KEY和 API Secret)登录,服务端返回一个随机生成的token,可以是随机字符串,也可以是UUID等,把它存于数据库或缓存中,然后返回给客户端
3.客户端调用接口时,参数带上返回的token,服务端验证token,若有效则允许客户端访问接口,否则拒绝访问

1、这个机制可以有效的防止DOS攻击
1.客户端每次请求接口都要带上当前的时间戳
2.服务端获取到时间戳参数之后就与当前时间对比
3.如果时间差大于某个设置的值(比如3分钟),则设置请求无效

1、这个机制可以有效的防止数据被其他用户篡改
1.客户端登录请求获取token
2.使用token 和 当前时间戳 加请求中的其他参数(除了 sign 本身以外),按照规定的顺序排序,比如键值字典排序( PHP 的KSORT() )组合成一个请求参数字符串,
3.使用MD5或者SHA-1算法加密请求参数字符串,根据需求可以在加密中加点盐(加密字符串),生成sign
4.客户端每次请求带上 sign , 然后在服务端用同样的算法生成sign签名 , 两者进行比对,相等则允许访问接口

1、这个机制可以确保URL被别人获取了也无法使用(比如爬取数据)
1.客户端第一次访问时,将生成的sign放到缓存或者数据库中。
2.客户端第二次访问,判断sign是否与存在缓存或者数据库中的sign一致。
3.不一致则允许调用接口,一致则拒绝用户调用接口。
4.由于sign的存在,所以参数无法篡改,所以一个sign只能调用一次接口,再次调用就无效了。

1、这个机制可以限制每个IP请求接口的次数。
1.获取客户端请求IP,
2.每次访问记录客户端的IP请求记录,
3.判断客户端IP请求在短时间内(比如一分钟)是否超过规定的次数(比如10次),
4.如果超过则临时拒绝该IP访问,并记录当日IP访问异常次数,
5.如果当日该IP访问异常次数超过规定次数(比如3次),则拒绝该IP继续访问接口。
