在部署CDN的情况下,一般免费的版本能防御的CC攻击很有限,即使收费的版本依然难以抵挡。接入相关安全方面的防御技术,价格贵(部署硬件方面暂不考虑)。在部署CDN的情况下,一般免费的版本能防御的CC攻击很有限,即使收费的版本依然难以抵挡。接入相关安全方面的防御技术,价格贵(部署硬件方面暂不考虑)。
在面临CC攻击中,WEB应用中,编程环境应用和数据库应用在占用的资源是最多的,最好的办法是将对外展示的全部静态化,并将执行动态的应用进行关闭或隐藏,让外部无法直接影响或利用到动态应用。
静态化一方面可以有效降低资源的利用,同时可以抵御大部分来自WEB安全的攻击。
如果你使用的WordPress框架,上面有工具可以将网页进行半自动化静态,不足的地方是外部还是可以直接影响到动态应用,这里详情就不多介绍。
如果是全站静态化,在文章的添加修改 ,用户评论问题是一个难题,其中最难以解决的就是用户评论问题,源站部署没有该问题。
原理
在被cc过程中,由于多个IP对其服务器进行请求,部署在服务器上的WAF或防火墙很难判断是否为正常流量,用户在请求过程中对服务器资源最大是动态的应用,如PHP、MySQL、python、java等应用,将其动态渲染出来的效果保存一份并将其复制一份在根目录下(注意这里需要理解网站目录的解析层次关系),用户在请求访问该网址时优先访问该静态网页资源,而不是动态的,在文章更新时只需要重新缓存一份即可。
单台服务器的情况
情况一:仅将应用渲染出来的最终页面进行静态化,这样对目前现有的应用影响是最小的,缺点是会对目前应用部分的功能存在一定的影响,同时用户依然可以访问你动态的程序。
情况二:在原有的应用下再添加一个对外的应用(Apache、nginx),原来的服务都转移到别的端口中,对目前现有的应用影响是比较大,需要精通熟悉应用业务,同时需要隐藏服务器的地址(使用CDN便可以解决)
拥有两台服务器
这与网站动静分离是类似的,这里是将动静应用进行分离。
静态服务器:
对外访问,只需要获取自己的第二服务器的资源将它处理成静态化。
动态服务器:
可以用内网机器穿透到外网(也可以在静态服务器搭建穿透服务或类似的连接,静态服务器在访问就类似访问内网的效果),只需要静态服务器可以访问动态服务器便可。
更安全可靠、可部署的业务更多更强,但缺陷是业务影响问题更大,如跨域问题,安全通讯问题等
前提:你需要如何获取自己最新渲染的页面(网站地图)
以下是本站的源码,将动态的网页缓存成静态,本站采用的是 Yoast SEO生成的地图,请将源码中的url_list列表改为你自己的。可以在源码中添加循环,本站采用其它定时器去运行。
本站采用单台服务器情况一,如果是两台可以考虑docker加nps的方案,或者docker+openvpn都可以实现。
由于精力有限,不做过多的讲解,小白可能难以理解,也没有精力去做教程。
# -*- coding:utf-8 -*- # WordPress转成静态html,在命令行下任意添加一个参数便重新缓存 import requests from xmltodict import parse import sys,time,os # 获取url列表 def get_url(url_list): try: url_lists = [] # 遍历所有地址存到这里 for i in url_list: date_url = parse(requests.post(i).text) for url in date_url.get('urlset', {}).get('url', {}): url_lists.append(url.get('loc','')) return url_lists except Exception as e: print('错误:',e) return [] def get_text(url,url_lists): if not os.path.exists('./url.txt'): with open('./url.txt', 'w') as f: print('url.txt 文件不存在 已创建文件') with open('./url.txt', 'r') as f1: in_url = f1.read().strip().split('\n') # 缓存操作 if len(sys.argv) > 1: print('重新缓存中...') for s in in_url: if s == '': s = 'index.html' print(f'删除: {s}') try: os.remove(s) except Exception as e: print(f'{s} 删除失败!') in_url = [] with open('./url.txt', 'w', encoding='utf-8') as ff: pass print('清空缓存完成,正在重新获取') for i in url_lists: name = i.replace(url,'') if '/' in name: print('存在子分类,由于文件夹和文件不能同名,这里就不在做子分类的延续') continue # 已经缓存的文件就不再缓存 if name in in_url: continue try: print(f'获取: {i}') time.sleep(1) # 防止太快被服务器防火墙封禁 html = requests.post(i).text if name == '': name = 'index.html' with open(f'{name}','w',encoding='utf-8') as ff: ff.write(html) with open('./url.txt', 'a', encoding='utf-8') as fff: fff.write(name + '\n') except Exception as e: print(e) url = 'https://www.jiubanyipeng.com/' # 这里是用来替换使用的,一定要完整的url地址且要加上 / url_list = [url+'post-sitemap.xml', url+'page-sitemap.xml', url+'category-sitemap.xml'] # 文章 插件内链 插件内链 分类 标签 等自己添加进来 get_text(url,get_url(url_list))