防盗链与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都可以用于做防盗链,只不过不像前面三种那么方便设计与使用。
防盗链与token运用的更多相关文章
- FastDFS防盗链
FastDFS扩展模块内置了通过token来实现防盗链的功能.开启防盗链后,访问文件是需要在url中加两个参数:token和ts.ts为时间戳,token为系统根据时间戳和密码生成的信物.为了系统的安 ...
- 秋天的第一份“干货” I Referer 防盗链,为什么少了个字母 R?
Referer 为什么叫 Referer?它代表什么意思?在诸多防盗链竞争中它有什么优势? 今天,在聊 Referer 防盗链之前,先来聊聊我们在现实生活中常常碰到的推荐人(Referrer)信息. ...
- SpringBoot集成FastDFS+Nginx整合基于Token的防盗链
为什么要用SpringBoot? SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人 ...
- 【七牛云】时间戳防盗链鉴权php实现
基于时间戳防盗链的功能其实每家的CDN都是支持的.主要是通过使用约定的加密字符串来对具有访问有效期的资源链接进行一些加密计算的到一个sign值,然后访问外链里面带上这个sign和截止时间戳去访问CDN ...
- 防盗链&CSRF&API接口幂等性设计
防盗链技术 CSRF(模拟请求) 分析防止伪造Token请求攻击 互联网API接口幂等性设计 忘记密码漏洞分析 1.Http请求防盗链 什么是防盗链 比如A网站有一张图片,被B网站直接通过img标签属 ...
- 防盗链测试01 - Jwplayer+Tengine2.3.1 mp4模块打造流媒体测试服务器
最近有个想法,想做类似下面的视频URL验证: 1.URL Tag Validation 2.Special format of URL for preventing unauthorized usag ...
- sql注入,xss攻击,csrf(模拟请求),防盗链
如何防止别人模拟请求? 使用令牌token解决模拟请求 好处是 唯一性只能有一次请求 已经拿到生成的token 如何防止呢? 怎样防止非人工? 使用验证码 xss攻击? xss攻击也叫脚本注入 ...
- 实现fastdfs防盗链功能
目录 1.背景 2.实现原理 2.1 开启防盗链 2.2 重启 nginx 2.3 Java代码生成token 1.token生成规则 2.java生成token 3.测试 3.1 带正确token访 ...
- JAVA防盗链在报表中的应用实例
今天我们来聊聊Java防盗链,多说无用,直接上应用案例. 这里所用的工具是报表软件FineReport,搭配有决策系统(一个web前端展示系统,主要用于权限控制),可以采用java防盗链的方式来实现页 ...
随机推荐
- 【转】使用nvm快速搭建 Node.js 开发环境
原文链接:http://www.cnblogs.com/shuoer/p/7802891.html 快速搭建 Node.js 开发环境 如果你想长期做 node 开发, 或者想快速更新 node 版本 ...
- Libevent(2.1.8)中的事件结构和管理
Libevent(2.1.8)中的事件结构体 这里的libevent版本为 2.1.8 . libevent中事件的结构体struct event,定义在event_struct.h 中, 这里我们简 ...
- icheck如何修改样式大小
icheck默认样式比较大,有需求调整checkbox大小. 1. 最简单的方法可用css3来实现,让整个模块层缩放,不兼容低版本浏览器. transform:scale(0.7,0.7) 2. ...
- mysql 系统性浅聊 myisam 存储引擎【原创】
>>思维导图 >>介绍 mysql中的存储引擎都是以插件的形式存在,目前用的最多存储引擎就是innodb和myisam.MySQL5.5.5以后(包括5.5.5)默认使用Inn ...
- poj 1064 Cable master 判断一个解是否可行 浮点数二分
poj 1064 Cable master 判断一个解是否可行 浮点数二分 题目链接: http://poj.org/problem?id=1064 思路: 二分答案,floor函数防止四舍五入 代码 ...
- Codeforces 438D The Child and Sequence
题意:给定一个n个数的序列,完成以下3个操作: 1.给定区间求和 2.给定区间对x取模 3.单点修改 对一个数取模,这个数至少折半.于是我们记一个最大值max,如果x>max则不做处理. #in ...
- JS的隐式转换 从 [] ==false 说起
前言 最近和大创扯淡时说到了[] == false,从结果上来看我俩都答错了,从气势上来说我俩的歪理都能出书了(恩,程序猿的骄傲),但是这其实背后隐藏了一潭很深的水,对,很深... 隐式类型转换 JS ...
- java 后台代码调用接口
import com.jiuqu.jollykeys.common.util.JsonUtil;import java.io.UnsupportedEncodingException;import j ...
- laravel 对查询结果的二次筛选
假设有表Scores 里面有 id,math,english等字段,现在要求按总分(数据库没有这个字段)来排序或者筛选,用having()方法就可以很方便解决这个问题. $scores = Score ...
- 运行循环 - RunLoop
1.RunLoop简介 1.1 什么是RunLoop 简单来说就是:运行循环,可以理解成一个死循环,一直在运行. RunLoop实际上就是一个对象,这个对象用来处理程序运行过程中出现的各种事件(触摸. ...