秒殺接口地址的隱藏


 

 問題:秒殺頁面中如果商品秒殺鏈接要是提前暴露出去可能有人直接訪問url就提前秒殺了

 解決:做個時間校驗不就可以解決了嗎?沒到秒殺時間不給秒殺。這種方案也存在問題,既然我知道了秒殺請求鏈接,那我通過程序不斷獲取最新的北京時間,可以達到毫秒級別的,我就在00毫秒的時候請求,我敢說絕對比你人工點的成功率大太多了,而且我可以一毫秒發送N次請求,搞不好你賣100個產品我全拿了。

 那這種情況怎么避免?

  簡單,把URL動態化,就連寫代碼的人都不知道,你就通過MD5之類的加密算法加密隨機的字符串去做url,然后通過前端代碼獲取url后台校驗才能通過。  

怎么實現邏輯?

思路:

  1.在進行秒殺之前,先請求一個服務端地址,/getmiaoshaPath 這個地址,用來獲取秒殺地址,傳參為 商品id,在服務端生成隨機數(MD5)作為pathId存入緩存,(緩存過期時間60s),然后將這個隨機數返回給前端.

  2.獲得該pathid,后 前端在用這個pathid拼接在Url上作為參數,去請求domiaosha服務

  3.后端接收到這個pathid 參數,並且與 緩存中的pathid 比較。

  如果通過比較,進行秒殺邏輯,如果不通過,拋出業務異常,非法請求。

/*點擊秒殺之后 就訪問后端 獲取一個秒殺地址pathId*/
function getMiaoshaPath() {
    $.ajax({
        url :"/miaosha/getPath",
        type : "GET",
        data:{
            goodsId :$("#goodsId").val(),
            verifyCode : $("#verifyCode").val()
        },
        success:function(data){
            if (data.code ==0) {//
                var path = data.data
                domiaosha(path)
            }else {
                layer.msg(data.message)
            }
        },
        error :function () {
            layer.msg("客戶端錯誤")
        }
    })
 
}
 
    function domiaosha(path){
        $.ajax({
            url :"/miaosha/"+path+"/do_miaosha",//安全優化,帶着這個path去訪問
            type : "POST",
            data:{
                goodsId :$("#goodsId").val()
            },
            success:function(data){
                if (data.code ==0) {//成功 就跳轉 訂單頁面 並傳入 orderid
                    // window.location.href= "/order_detail.htm?orderId="+data.data.id;
                    //若果返回成功,即表示收到請求,等待中
                    getMiaoshaResult($("#goodsId").val());
                }else {
                    layer.msg(data.message)
                }
            },
            error :function () {
                layer.msg("客戶端錯誤")
            }
        })
    }
/**
     * 安全優化之 ---接口地址隨機化(隱藏)
     * 1.點擊秒殺之后,先訪問該接口生成一個pathId,並存入redis 返回前端
     * 2.前端帶着這個pathId去訪問秒殺接口,如果傳入的path和從redis取出的不一致,就認為 非法請求
     */
    @AccessLimit(seconds = 5,maxCount = 5,needLogin = true)
    @RequestMapping(value = "/getPath", method = RequestMethod.GET)
    @ResponseBody
    public Result<String> getPath(HttpServletRequest request,MiaoshaUser user, Model model,
                                  @RequestParam("goodsId") long goodsId,
                                  @RequestParam(value = "verifyCode")String verifyCode) {
        if (user == null) {
            return Result.error(CodeMsg.SESSION_ERROR);
        }
 
 
        String str = UUIDUtill.uuid();
        /*隨機生成 一個 pathId 返回給前端*/
        String pathId = Md5Util.md5(str + "1111");
        redisService.set(MiaoshaKey.getMiaoshaPath, "" + user.getId() + goodsId, pathId);
/**
     * URL md5加密
     * @param url
     * @return
     */
    public static String Md5ForUrl(String url) {
        try {
            MessageDigest md5 = MessageDigest.getInstance("MD5");
            md5.update(url.getBytes("UTF-8"));
            byte[] b = md5.digest();
            
            int i;
            StringBuffer buf = new StringBuffer();
            for(int offset = 0, len = b.length; offset < len; offset++) {
                i = b[offset];
                if(i < 0) {
                    i += 256;
                }
                if(i < 16) {
                    buf.append("0");
                }
                buf.append(Integer.toHexString(i));
            }
            url = buf.toString();
            System.out.println("result = " + url);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return url;
    }

 

  該操作:可以為了防止,惡意用戶登陸之后,獲取token的情況下,通過不斷調用秒殺地址接口,來達到刷單的惡意請求。

  每次的url都不一樣,只有真正點擊秒殺按鈕,才會根據商品和用戶id生成對應的秒殺接口地址。

 

  但是,這種情況仍然不能解決 利用 按鍵精靈或者 機器人 頻繁點擊按鈕的操作,為了降低點擊按鈕的次數,以及高並發下,防止多個用戶在同一時間內,並發出大量請求,加入數學公式圖形驗證碼等防高並發優化。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM