• 防盗链与token运用


    为什么要防盗链?

    例如手机/PC应用,如果有人知道你的api地址,和应用格式,那么他人就可以利用这个接口进行盗链;盗取/盗用里面的数据。

    防盗链特性:

    1、因为是非开放性的,所以所有的接口都是封闭的,只对公司内部的产品有效;

    2、因为是非开放性的,所以OAuth那套协议是行不通的,因为没有中间用户的授权过程;

    3、有点接口需要用户登录才能访问;

    4、有点接口不需要用户登录就可访问;

    现在的接口基本是mvc模式,URL基本是restful风格,URL大体格式如下 

    http://test.com/模块名/控制器名/方法名?参数名1=参数值1&参数名2=参数值2&参数名3=参数值3

    防盗链方法一 keyword 口令应用:

    声明一个keyword 口令,例如'abc',每次请求都要将keyword 推送至服务端,服务端对keyword进行对比,匹配正确后返回data。此方法只适用在手机APP中,因为使用在PC端,很容易被人截取keyword。

    例子:http://test.com/模块名/控制器名/方法名?key=keyword

    防盗链方法二 url permitted 匹配:

    将允许的url保存至数据库中,通过$_SERVER['HTTP_REFERER'] 获取 推送请求者的url,然后与 url permitted 库进行匹配,匹配到后则返回data。此方法只使用于PC网页端,因为手机端没有固定的url。

    <?php
       if(isset($_SERVER['HTTP_REFERER'])){
            if(strpos($_SERVER['HTTP_REFERER'],"url permitted")==0)
           {
                  echo "surcess";
           }
           else echo "error";
       }
     ?>
    

    防盗链方法三 token:

    它的职责是保持接口访问的隐蔽性和有效性,保证接口只能给自家人用。

    token设计方法有很多,可以自定义算法,下面就介绍一种 MVCrestful 的一种md5 加密算法。 

    设计规则:

    api_token = md5 ('模块名' + '控制器名' + '方法名' + '2017-04-17' + '加密密钥') = 388b0934e1ec3e0cd50ffe94e152020e

    1.2017-04-17 位当天时间

    2.'加密密钥' 为私有的加密密钥,手机端需要在服务端注册一个“接口使用者”账号后,系统会分配一个账号及密码,数据表设计参考如下

    字段名

    字段类型

    注释

    client_id

    varchar(20)

    客户端ID

    client_secret

    varchar(20)

    客户端(加密)密钥

    <?php
    // 1、获取 GET参数 值
    $module = $_GET['mod'];
    $controller = $_GET['ctl']
    $action = $_GET['act'];
    $client_id = $_GET['client_id'];
    $api_token = $_GET['api_token'];
    // 2、根据客户端传过来的 client_id ,查询数据库,获取对应的 client_secret
    $client_secret = getClientSecretById($client_id);
    // 3、服务端重新生成一份 api_token
    $api_token_server = md5($module . $controller . $action .  date('Y-m-d', time()) .  $client_secret);
    // 4、客户端传过来的 api_token 与服务端生成的 api_token 进行校对,如果不相等,则表示验证失败
    if ($api_token != $api_token_server) {
    	    exit('access deny');  // 拒绝访问
    }
    ?>
    

    此方法有效用于所有平台。

    防盗链方法四 其他:

    实际登录,cookie,session都可以用于做防盗链,只不过不像前面三种那么方便设计与使用。

      


     
      

  • 相关阅读:
    RestTemplate方法总结
    服务器上获取不到header中设置的自定义的属性值
    记录一次 事务问题 的处理
    java 集合按照 数值排序,如果数值一致 按照名字首字母排序
    mysql中按照中文首字母A-Z排序
    java 关于小数 换算整数 的一点想法
    mysql 根据身份证查询 年龄 性别
    MySQL普通索引(BTREE索引)以及最左前缀匹配
    net.sf.json的常用api
    Object划分
  • 原文地址:https://www.cnblogs.com/peiyu1988/p/6723425.html
Copyright © 2020-2023  润新知