首页 > WEB开发 > 前端接口防刷方法探究

前端接口防刷方法探究

暴露在前端的接口被刷是件很头疼的事,这件事情无解,根据我观察,目前主流有三种方法:
1.通过JS注入cookie数据,此cookie数据会在后端进行校检,此种方式必须采用渲染js来进行破解,提高了刷接口成本。

2.在前端对请求参数进行加密,加密方法采用代码混淆技术,这种成本比较低,效果还不错。

3.每次请求生成一个唯一字符串,把该字符串注入cookie中,此串只能用一次,当访问接口时会校检该串是否有效或是否被用过,无效串直接403。

出于成本考虑我采用1和2两种方法的结合,具体流程如下:

1.生成一个与时间戳有关系的字符串K,该字符串可采用RC4加密算法生成,保证加密串可以被还原成时间戳。

2.将K注入cookie中

3.前端拿到K,根据请求参数算出SIGN

4.前端把SIGN和请求参数传递到后端,后端首先提取出K计算是否有效、是否过期了一定时间间隔,然后计算SIGN是否有效

 

 /**
     * 获取与时间戳有关的加密串
     * @return string
     */
    public static function getEncryptionKey() {
        $timeStamp = strval(time());
        $rc4Ret = self::rc4(self::COMMON_SECRET_KEY, $timeStamp);
        return base64_encode($rc4Ret);
    }

    /**
     * 从加密串中解出时间戳
     * @param $key
     * @return string
     */
    public static function decodeEncryptionKey($key) {
        return self::rc4(self::COMMON_SECRET_KEY, base64_decode($key));
    }

    /**
     * 验证加密串是否有效,考虑时间戳的失效时间。
     * @param $key
     * @return bool
     */
    public static function checkEncryptionKey($key) {
        $nowTimeStamp = intval(time());
        if (!empty($key)) {
            $encyptionTimeStamp = intval(self::decodeEncryptionKey($key));
            return (($encyptionTimeStamp + self::MAX_VALID_TIME_INTERVAL) >= $nowTimeStamp);
        }
        return false;
    }

分类: WEB开发 标签:
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.

Time limit is exhausted. Please reload CAPTCHA.