--永恒的烦恼

网站被CC攻击或访问人数过大,该如何最小成本去解决?

在部署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))
赞(3) 打赏
转载请带上源站链接:玖伴一鹏 » 网站被CC攻击或访问人数过大,该如何最小成本去解决?

觉得文章有用就打赏一下文章作者

非常感谢你的打赏,我们将继续给力更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫打赏

微信扫一扫打赏