博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
防盗链
阅读量:4622 次
发布时间:2019-06-09

本文共 3286 字,大约阅读时间需要 10 分钟。

  要说防盗链,得先说盗链。见名知义,盗链就是盗取别人的链接,最常见的就是盗图了。那么怎么防火防盗呢?传统的防盗链是通过http协议中的referer请求头来跟踪请求的来源,进而判断是否本站点的请求,从而达到防盗的目的。Referer长啥样?我用Fiddler抓了个包,看图

 

 

 

 

 

 

 

 

 

 

 

       

 

  但目前更流行的防盗链方式是url签名,基本实现方案是针对请求参数签名,加入到url中,接收到该url后验证签名,通过则说明是自己人。参数的选取一般是个变量,比如时间戳、用户ID,签名算法一般是MD5。下面看个例子:

public void action(HttpServletRequest request, HttpServletResponse response)    {        String purl = RequestTool.getParameter(ParamKeys.purl);                // 获取原来的加密串        String oldHash = RequestTool.getParameter(ParamKeys.safetyChainHashValue);                // 获取session中保存的随机数        String rands = (String)RequestTool.getSession().getAttribute(AttributeKeys.RANDOM_NUM);                String msisdn = UserSession.getUserID(request);                // 防盗链加密并加上随机数        String hash = OrderHashTools.getSameUserHash(msisdn, rands);        String newHash = SessionTools.encode(hash);                // 防盗链校验通过,清空session中的随机数        RequestTool.getSession().removeAttribute(AttributeKeys.RANDOM_NUM);                OptResultBean resultBean = new OptResultBean();                resultBean.setBackUrl(purl);                // 如果防盗链不相等则跳通用的操作结果页        if (StringTools.isEmpty(oldHash) || StringTools.isEmpty(newHash) || !StringTools.isEq(oldHash, newHash))        {                        String sucMsg = PortalCacheManager.getParamValue("Anti_theft_chain_describe");            resultBean.setResultMsg(sucMsg);            RequestTool.getSession().setAttribute(AttributeKeys.OPERATE_RESULT, resultBean);                        // 跳通用的操作结果页            String url = UrlTools.processForView(PreUrlConfig.getPreUrl(PreUrlConfig.OPERATE_RESULT_URL));                        RequestTool.sendRedirectAppendParams(url);            return;        }                // 领取提示语        String sucMsg = "";        // 结果码        String resultCode = "";                Response resp =            ((IserverService)ContextRegistry.getContextHolder().getContext().getBean("WlfService"))                .exchangeCode("", "", "");        if (Util.isNotEmpty(resp))        {            resultCode = resp.getResultCode();            if (StringTools.isEq(resultCode, GET_KINDLE_SUCCESS))            {                // 领取成功                sucMsg = resp.getPromptSuccess();                resultBean.setResultMsg(sucMsg);            }            else if (StringTools.isEq(resultCode, GET_KINDLE_FAIL))            {                // 领取失败                sucMsg = resp.getPromptFailure();                resultBean.setResultMsg(sucMsg);            }        }                RequestTool.getSession().setAttribute(AttributeKeys.OPERATE_RESULT, resultBean);        // 跳通用的操作结果页        String url = UrlTools.processForView(PreUrlConfig.getPreUrl(PreUrlConfig.OPERATE_RESULT_URL));                RequestTool.sendRedirectAppendParams(url);                return;    }

  看下加密算法:

/**     * 根据手机号获得防盗链key加随机数     * @param msisdn 手机号     * @param random 随机数     * @return     * @see [类、类#方法、类#成员]     */    public static String getSameUserHash(String msisdn,String random)    {        StringBuffer sb = new StringBuffer();        sb.append(msisdn);        sb.append(ENCRYPT_KEYS);        sb.append(random);                // 对字符串做MD5加密,再进行Base64编码        return ThreeDes.base64AndMd5(sb.toString());    }

 

转载于:https://www.cnblogs.com/wuxun1997/p/9237991.html

你可能感兴趣的文章
【poj1087/uva753】A Plug for UNIX(最大流)
查看>>
使用Reachability监测网络变化-陈鹏
查看>>
正确遍历删除List中的元素方法(推荐)
查看>>
flask + Python3 实现的的API自动化测试平台---- IAPTest接口测试平台(总结感悟篇)...
查看>>
异步与多线程实现不阻塞区别
查看>>
openAI最近推出了一个新的语言模型 "GPT-2"
查看>>
工厂设计模式。。应用
查看>>
MySQL高可用架构-MHA环境部署记录
查看>>
K8S 日志收集(四):logstash 安装
查看>>
Python之字符串搜索和替换
查看>>
thinkphp 参数传值
查看>>
web中的position的意思理解
查看>>
java中Collection类及其子类
查看>>
关于无线的Idle Timeout和Session Timeout
查看>>
jquery对radio和checkbox的操作
查看>>
hadoop1.x和2.x的一些主要区别
查看>>
Unity多线程(Thread)和主线程(MainThread)交互使用类——Loom工具分享
查看>>
poshytip基本使用
查看>>
codeforces #313 div1 B
查看>>
php 模拟post的新发现,重点在最后的新方法
查看>>