一种网站静态资源防盗链方法与流程

文档序号:19730019发布日期:2020-01-18 03:50阅读:1233来源:国知局
一种网站静态资源防盗链方法与流程

本发明属于互联网技术领域,具体涉及一种网站静态资源防盗链方法。



背景技术:

静态资源(一般是js、css、视频、下载资源)防盗链一直是个难题,网站上的静态资源如果不做防盗链,可以被互联网上任意网站引用,可能被同行或者竞争对手引用,甚至可能被黄赌毒网站引用,google等搜索引擎会认为静态资源链接为恶意资源,从而影响静态资源域名链接,可能会影响网站推广效果,所以静态资源防盗链很必要。

最简单的静态资源防盗链方法是能保证引用静态资源的域名固定或者访问者ip固定,这样只需限制静态资源请求的来源域名或可信任ip白名单即可阻止恶意的静态资源访问。但实际上系统平台上引用静态资源的域名数量根本不可控,访问ip更是无法预测,最简单的防盗链情况适用于个人站或者小的系统平台,但无法应对访问量大或者访问情况复杂的平台防盗链任务。

系统平台为保证较高的静态资源访问速度,一般都选择接入cdn(全称是contentdeliverynetwork,即内容分发网络),cdn专门负责内容的分发,其内涉及大量的内容资产,防盗链是cdn不可或缺的组成部分。通常cdn防盗链方法有3种:(1)referer防盗链:通过配置访问的referer黑白名单来对访问者身份进行识别和过滤,从而限制资源被访问的情况;然而平台客户域名多变且不固定,cdn上提供的referer防盗链都有来源域名数量限制,很容易超出数量上限,不适合通过referer来防盗链;(2)ip黑白名单防盗链:通过定义ip黑白名单,对列入黑名单的用户ip阻止访问,然而网站访问者ip根本无法确定,此方法并不适用;(3)url鉴权防盗链:属于高级防盗链,设置鉴权key对url加密,保护用户源站资源,然而系统平台静态资源链接不适合涉及失效时间的防盗链。

目前主流cdn(阿里cdn、腾讯cdn,百度cdn)防盗链能够解决大部分客户需求,但无法满足系统平台的防盗链需求。实际上也可自建cdn服务,这样可以定制防盗链功能满足个性化要求,但自定义cdn服务成本太大,投入产出不成正比,而且还需要必要的技术储备,实现难度较大。



技术实现要素:

本发明所要解决的技术问题是克服现有技术的不足,提供一种网站静态资源防盗链方法,具体步骤包括:

步骤1:初始化阶段;按照amazoncloudfront服务配置过程,将网站静态资源域名链接接入cloudfront;在cloudfront处设置静态资源非法访问的错误响应及错误响应缓存时间;在cloudfront的白名单标头名单中添加“referer-host”标头;以http状态码标识响应状态,所述响应状态包含正确响应和错误响应;所述错误响应分为短期拒绝访问的错误响应和长期拒绝访问的错误响应,所述“短期拒绝访问”中错误响应的缓存时间比“长期拒绝访问”中错误响应的缓存时间短;

步骤2:使用nodejs编制lambda@edge函数并设置函数执行时间;lambda@edge函数获取请求报文中的请求头,并提取请求来源的域名作为“referer-host”标头的内容;通过cloudfront触发器建立cloudfront事件与lambda@edge函数关联,设置函数在cloudfront接收到用户http请求时执行域名提取;

步骤3:通过lambda@edge函数的执行,在请求报文中的请求头中新增自定义“referer-host”标头和标头的内容;

步骤4:根据referer-host字段内容和请求获取的静态资源,cloudfront检查缓存区内是否存在对该请求的回应,如若存在,将回应返回至浏览器端;如若不存在,执行步骤5;其中,缓存区中的请求的回应包括错误回应和正确回应,所述错误回应是反馈错误响应的http状态码;所述正确回应是请求获取的静态资源;

步骤5:根据静态资源域名链接,cloudfront将资源访问请求转发至静态资源源站点,源站点将referer-host标头的内容值与本地存储的合法域名进行比对,如在合法域名中找到referer-host标头的内容,则比对成功,请求源域名(请求来源的域名地址)合法,返回静态资源;如若在合法域名中没有找到referer-host标头的,继续执行referer-host标头的内容与本地存储的黑名单域名的比对,如若在黑名单域名找到referer-host标头的内容,则请求源域名为恶意域名;如若没有找到,请求源域名为不合法域名;

步骤6:源站点根据域名类型执行相应操作;针对合法请求源域名,访问视为合法,源站点将用户所需的静态资源返回至cloudfront,同时在返回的响应头中添加缓存控制字段,所述缓存控制字段为cache-control,字段内容是静态资源在cloudfront中的缓存时间,所述缓存时间根据源站点静态资源的更新周期确定;针对恶意域名,视为非法访问,源站点在返回的响应头中设置“长期拒绝访问”的错误回应码,针对不合法域名,视为非法访问,源站点在返回的响应头中设置“短期拒绝访问”的错误回应码;

步骤7:cloudfront接收到响应头后,建立静态资源请求与响应间的对应关系,并将对应关系存入cloudfront边缘缓存区;根据缓存控制字段内容,将缓存字段指定的缓存时间设为对应关系在cloudfront边缘缓存区的缓存时间;

步骤8:cloudfront将响应内容发送至http客户端,如若是合法访问,将接收到静态资源发送至http客户端;如若是非法访问,直接返回错误响应码给http客户端。

所述步骤1中,所述短期拒绝访问的错误响应是指针对白名单和黑名单中都没有记录的请求源域名做出的反应,缓存时间范围定在3天至7天;所述长期拒绝访问的错误响应是针对黑名单中记录的请求源域名做出的反应,缓存时间范围定在半年至一年。

所述步骤3的lambda@edge函数执行过程包括:终端用户通过浏览器访问包含静态资源链接的网页,点击链接触发静态资源访问请求的发送,待浏览器获取到请求转送至cloudfront时,触发lambda@edge函数执行;lambda@edge函数提取http请求头中referer-host标头的内容标头值,对其执行正则处理后得到请求源域名;在http请求头中新增referer-host标头,将得到的请求源域名作为referer-host标头的内容。

所述步骤1中,“短期拒绝访问”的http状态码设为错误400,结合白名单更新周期,在不影响请求源域名对静态资源源站点正常访问情况下,选择时间范围内的最长时间作为缓存时间,缓存时间选择最长时间,设置为7天;“长期期拒绝访问”的http状态码设为错误405,结合黑名单域名更新周期,同时降低静态资源源站点对黑名单域名的请求处理次数,错误缓存时间选择最长时间,设置为1年;所述步骤6中,“长期拒绝访问”错误响应码和“短期拒绝访问”错误响应码均与步骤1配置在cloudfront的错误响应码一致。

所述步骤7具体为:针对合法访问的正确响应,请求来源域名与请求的静态资源之间建立一一对应的关系,对应关系在缓存区内的有效时间按照cache-control字段指定的时间配置,且缓存期过后,需等下次执行相同请求时再执行资源的缓存;针对非法访问的错误响应,请求来源域名及错误响应码之间建立一一对应的关系,对应关系在缓存区内的有效时间按照步骤1设定的错误响应缓存时间配置,且缓存期过后,需等下次执行违法请求时再执行错误响应的缓存。

本发明所达到的有益效果:

(1)本发明通过编制lambda@edge函数,在cloudfront获取到请求时提取请求源域名,用作为新增自定义标头referer-host的值;根据referer-host值与源站本地的白名单和黑名单域名比对结果判定请求访问的合法与否,本地存储的域名数量不受限制,在无需其他加密、ip判定等辅助配置下,以低成本少配置的方式构建防盗链;

(1)本发明利用cloudfront的内容缓存机制,将资源请求和响应内容之间的对应关系进行缓存,保证同一个请求源域名访问相同静态资源时,仅在第一次从源站点拉取响应,之后均从cloudfront缓存中拉取响应,减少因频繁请求源站点而对后端服务器产生压力。

附图说明

图1为本发明实施例中一种网站静态资源防盗链方法实现流程图;

图2为本发明实施例中lambda@edge函数执行代码的示意图;

图3为本发明实施例中cloudfront对请求响应的处理流程图;

具体实施方式

下面结合附图和示例性实施例对本发明作进一步的说明:

如图1为本发明实施例中一种网站静态资源防盗链方法实现流程图,具体步骤包括:

步骤s1:初始化配置;按照amazoncloudfront服务配置过程,将网站静态资源域名链接接入cloudfront;在cloudfront处设置静态资源非法访问的错误响应及错误响应缓存时间;在cloudfront的白名单标头名单中添加“referer-host”标头;

错误响应分为短期拒绝访问和长期拒绝访问,以http状态码标识;所述短期拒绝访问的错误响应是针对白名单和黑名单中都没有记录的请求源域名做出的反应,由于无法立即判定请求来源的域名是否合法,缓存时间范围定在3天至7天;所述长期拒绝访问的错误响应是针对黑名单中记录的请求源域名做出的反应,缓存时间范围定在半年到一年;更具体的,如若错误响应是“短期拒绝访问”,错误响应码设为错误400,缓存时间是7天;若错误响应是“长期期拒绝访问”,错误响应码设为错误405,错误响应的缓存时间为1年;

步骤s2:使用nodejs编制lambda@edge函数并设置函数执行时间:编辑函数getrefererhostname(referer),配合正则处理公式,提取请求报文中的请求头的referer字段,并将提取的referer字段内容作为“referer-host”标头值;通过cloudfront触发器建立cloudfront事件与lambda@edge函数关联,设置函数在cloudfront接收到用户http请求时执行域名提取;具体实现代码如下:

步骤s3:通过lambda@edge函数的执行,在请求报文中的请求头中新增自定义的“referer-host”标头值:终端用户通过浏览器访问包含静态资源链接的网页,点击链接触发静态资源访问请求的发送,待浏览器获取到请求转送至cloudfront时,触发lambda@edge函数执行;lambda@edge函数提取http请求头中referer字段的内容,对其执行正则处理后得到请求源域名;在http请求头中新增referer-host字段,将得到的请求源域名作为referer-host字段的内容;执行代码如图2,其中标识s2-1为获取来源网站的域名,标识s2-2为增加自定义referer-host请求头;

步骤s4:cloudfront缓存区中查找是否缓存对当前资源请求的回应:根据referer-host字段内容和请求获取的静态资源,cloudfront检查缓存区内是否存在对该请求的回应,如若存在,将回应返回至浏览器端;如若不存在,执行步骤5;缓存区中的请求回应包括错误回应和正确回应,错误回应是反馈错误响应码;正确回应是请求获取的静态资源;

步骤s5:经与本地白名单和黑名单域名比对,判断请求源域名的合法性:根据静态资源域名链接,cloudfront将资源访问请求转发至静态资源源站点,源站点将referer-host字段内容与本地存储的合法域名进行比对,如在合法域名中找到referer-host字段内容,比对成功,请求源域名合法,返回静态资源;如若在合法域名中没有找到referer-host字段内容,继续执行referer-host字段内容与本地存储的黑名单域名的比对,如若在黑名单域名找到referer-host字段内容,请求源域名为恶意域名;如若没有找到,请求源域名为不合法域名

步骤s6:根据域名类型,源站点形成不同响应头,告知cloudfront访问的合法性:针对合法域名,访问视为合法,源站点将用户所需的静态资源返回至cloudfront,同时在返回的响应头中添加缓存控制字段,即cache-control,字段内容是静态资源在cloudfront中的缓存时间;所述缓存时间是根据源站点静态资源的更新周期确定;

针对恶意域名,视为非法访问,源站点在返回的响应头中添加“长期拒绝访问”的错误回应码405;

针对不合法域名,视为非法访问,源站点在返回的响应头中添加“短期拒绝访问”的错误回应码400;

步骤s7:cloudfront接收到响应头后,建立静态资源请求与响应间的对应关系,并将对应关系存入cloudfront边缘缓存区,配置对应关系在缓存区内的有效时间;

具体为:

s7-1:针对合法访问的正确响应,建立请求来源域名与请求的静态资源之间一一对应的关系,对应关系在缓存区内的有效时间按照cache-control字段指定的时间配置;一旦超过有效时间,需等下次执行相同请求时再执行资源的缓存;

s7-2:针对非法访问的错误响应,建立请求来源域名及错误响应码之间一一对应的关系,对应关系在缓存区内的有效时间按照步骤1设定的错误响应缓存时间配置;一旦超过有效时间,需等下次执行非法请求时再执行错误响应的缓存;

步骤8:cloudfront将响应内容发送至http客户端,如若是合法访问,将将接收到静态资源发送至http客户端;如若是非法访问,直接返回错误响应码给http客户端;

以上实施例不以任何方式限定本发明,凡是对以上实施例以等效变换方式做出的其它改进与应用,都属于本发明的保护范围。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1