为什么要防盗链?
例如手机/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。
1 2 3 4 5 6 7 8 9 | <?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) |
客户端(加密)密钥 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <?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都可以用于做防盗链,只不过不像前面三种那么方便设计与使用。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?