多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
~~~ <?php namespace App\Services; class ApiValidatorService{ //具体来说,可以通过以下步骤来实现安全参数校验: // //在接口请求中添加时间戳参数,例如:timestamp=1622945123 //在接口请求中添加随机字符串参数,例如:nonce=abc123 //将所有请求参数按照参数名的字母顺序排序,例如:nonce=abc123&timestamp=1622945123 //将排序后的参数按照“参数名=参数值”的格式拼接成一个字符串,例如:nonce=abc123&timestamp=1622945123 //将拼接后的字符串加上一个密钥(可以是预先约定好的密钥),例如:nonce=abc123&timestamp=1622945123&key=secret //对加密后的字符串进行哈希计算,例如使用 MD5 算法,得到一个签名值,例如:c0c3f9a2a4c4c4dcd6d5b7b2a2e4d7b1。将签名值添加到接口请求中,例如:nonce=abc123&timestamp=1622945123&signature=c0c3f9a2a4c4c4dcd6d5b7b2a2e4d7b1 //在接口服务端对接口请求进行校验时,按照相同的算法计算签名值,并与请求中的签名值进行比对,如果一致,则说明请求合法,否则说明请求不合法 //通过以上步骤,可以有效地防止接口被恶意狂刷的攻击。 public $secret = 'FjCpjxsdfSsdssddd; /** * 参数签名 * @param array $params 所有的请求参数 * @param $sercet * @return string */ public function getSign(array $params,string $sercet):string{ if(isset($params['signature'])){ unset($params['signature']); }; ksort($params); $string = join('',$params); $string .= $sercet; return md5($string); } /**验证签名 * @param array $params * @param string $sercet * @return bool */ public function validateSignature(array $params,string $sercet):bool{ //判断请求参数中是否有签名字段,并且字段不能为空 if(empty($params['signature']) || empty($params['nonce']) || empty($params['timestamp'])) { return false; } //验证签名 if($this->getSign($params, $sercet) != $params['signature']) { return false; } return true; } } ~~~ ~~~ <?php namespace App\Http\Middleware; use App\Exceptions\ApiException; use App\Services\ApiValidatorService; use Closure; use Illuminate\Http\Request; class ApiCheckSign { public function handle(Request $request, Closure $next){ if( !$request->hasHeader('nonce') || !$request->hasHeader('timestamp') || !$request->hasHeader('signature')) { // 验证没通过 throw new ApiException('The verification failed!'); } $service = app(ApiValidatorService::class); $params['nonce'] = $request->header('nonce'); $params['timestamp'] = $request->header('timestamp'); $params['signature'] = $request->header('signature'); if (!$service->validateSignature($params, $service->secret)){ // 验证没通过 throw new ApiException('The verification failed!'); } return $next($request); } } ~~~