💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
## 一、概述 考虑到接口不应该被任意调用,必须进行调用管控,避免风险; ## 二、方案 ## **请求参数中追加签名参数raySignature和rayTimeStamp** 每个请求,都增加签名参数,具体方案如下: 1. 前端需先从后端获取合法授权的appId(固定位)和appSecret作为基准参数,这两个参数需要存到前端本地,必须考虑到因为安全因素,修改appSecret; 2. 所有的接口请求,除接口定义的参数外,额外的,必须(无论GET/POST)附加以下两个参数:raySignature和rayTimeStamp,这两个参数取值的算法如下所述: ``` rayTimeStamp=当前请求的时刻,格式为yyyyMMddHHmmssSSS(17位,如20210303125959131); raySignature=appId+md5(md5(rayTimeStamp)+appSecret) ``` ## **请求头中追加签名参数rayHeadSignature** 1.前端构造完参数部分的签名之后,需要继续构造请求头部的签名参数rayHeadSignature,算法如下; ``` rayHeadSignature=md5(raySignature+md5(md5(rayTimeStamp+appSecret)+appId)) ``` ## **安全增强** 为了规避恶意请求,平台继续提供更增强的参数验证算法,除上述实现及加密参数验证外,考虑到外部可能劫持合法的参数,在瞬间发起利用合法携带参数的攻击,平台增加了失效验证功能,也就是说,每个请求的安全参数(上述三个参数),只能被合法的使用有限次数(取决于配置,一般建议配置1即可),如果同一个合法时间戳在有效时间范围内(非有效时间范围内都不合法),多次被请求,就标识为非法了; ``` rayframework.security.ray-timestamp-before-minutes=3 rayframework.security.ray-timestamp-expire-minutes=3 rayframework.security.ray-timestamp-reuse-max-times=1 ``` ## 三、注意 1、需要注意的是,接口请求后,后端既校验合法性,也会校验时效性,前端编程需要注意,生成时间戳之后,如果提交的时间与生成时间之间间隔超过指定时间(依据后端配置约定),那么,即使是合法的请求,也会被后端拒绝; 2、如果是外部反调的接口(比如微信支付的回调接口),必须进行免验证设定,在接口的方法(controller)上,必须增加注解@RayEscapeRequestValidateControllerMethod,否则会导致外部请求不能成功;对于内部设计的某些特殊接口(如用于内部多媒体文件访问的,直接通过地址接口访问,无法注入头部参数的情况),可以通过增加注解@RayEscapeRequestHeaderValidateControllerMethod,避免验证头部签名; 3、如果客户端使用的appId或appSecret被泄露了,那么,后端更新该客户端设置或禁用,即可拒绝访问;