Compare commits
63 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
aab1852737 | ||
|
|
af908bc7ef | ||
|
|
905b19dce7 | ||
|
|
16f5205693 | ||
|
|
aec9095d7e | ||
|
|
8232677658 | ||
|
|
94b6fabc5f | ||
|
|
d65f689b26 | ||
|
|
9da2f189b4 | ||
|
|
d1e007cdc0 | ||
|
|
1cff17ea6d | ||
|
|
4c3b955b92 | ||
|
|
6e04f0b10f | ||
|
|
4a7ad7527e | ||
|
|
dd66ebc5c1 | ||
|
|
93698a7fe9 | ||
|
|
50a250c2a6 | ||
|
|
a469450be1 | ||
|
|
f3475a362f | ||
|
|
e10ccaf440 | ||
|
|
9748d8587f | ||
|
|
a66b82d878 | ||
|
|
d081ae11ea | ||
|
|
37960b6c70 | ||
|
|
f92b914551 | ||
|
|
e5ede1c94f | ||
|
|
75c9510aa5 | ||
|
|
3593b12c67 | ||
|
|
80e2616c19 | ||
|
|
b61a1bd169 | ||
|
|
d0165d5a1c | ||
|
|
3a549322af | ||
|
|
7d5328d7e6 | ||
|
|
9d4b987c93 | ||
|
|
ac15c5f015 | ||
|
|
7d0dcf828c | ||
|
|
fa642c12c9 | ||
|
|
a4a178bdfd | ||
|
|
43c40ec29f | ||
|
|
e967686adc | ||
|
|
58f65d6cca | ||
|
|
6941f74d2e | ||
|
|
7971e0ae5a | ||
|
|
8d7592a02b | ||
|
|
50b50d92bf | ||
|
|
812e878680 | ||
|
|
51b11777e4 | ||
|
|
e5e7b9a3af | ||
|
|
d87249c35b | ||
|
|
8a6bbf5ae6 | ||
|
|
060c3963d2 | ||
|
|
b0ff869012 | ||
|
|
2307d1bc2f | ||
|
|
5ab03f318a | ||
|
|
062da58867 | ||
|
|
5643069f99 | ||
|
|
004164a4c4 | ||
|
|
1da8bbd3ba | ||
|
|
a0656da78d | ||
|
|
ce98cfebfe | ||
|
|
84706be801 | ||
|
|
22aa38ea6b | ||
|
|
c1157d07c1 |
137
CHANGELOG.md
@@ -1,5 +1,142 @@
|
||||
# SAFELINE-CE CHANGELOG
|
||||
|
||||
## [5.5.0] - 2024-05-09
|
||||
|
||||
### 新增
|
||||
* 站点列表支持一键配置高级防护规则
|
||||
|
||||
### 优化
|
||||
* 黑白名单、人机验证、身份认证 页面合并为 “自定义规则”,简化导航
|
||||
* 黑白名单、身份认证 规则增加 “触发次数” “通过次数” 统计
|
||||
* 注:同一种规则类型内,触发的优先级为 新添加的自定义规则 > 旧添加的自定义规则 > 站点列表上一键配置的高级防护规则
|
||||
* 站点资源统计逻辑优化
|
||||
* 修复有时候免费证书临期不会自动续期的问题
|
||||
* 修复匹配条件中 ipv6 地址展示不正确的问题([#830](https://github.com/chaitin/SafeLine/issues/830))
|
||||
* 优化一些 UI 交互细节
|
||||
|
||||
## [5.4.0] - 2024-04-25
|
||||
|
||||
### 新增
|
||||
* 源 IP 获取方式增加 XFF
|
||||
* 专业版增加 系统设置->检测引擎性能配置,可以根据设备的配置等级选择不同的性能模式
|
||||
|
||||
### 优化
|
||||
* 修复浏览器内核版本 < Chromium 93 时,点击智能 AI 分析页面会崩溃的问题
|
||||
* 修复少数情况下,限频没有正常封禁 IP 的问题
|
||||
* 优化 luigi 统计算法,解决 CPU 占用过高的问题
|
||||
* 优化一些 UI 交互细节
|
||||
|
||||
## [5.3.3] - 2024-04-18
|
||||
|
||||
### 优化
|
||||
* 日志列表不返回 IP 组全部内容,降低访问耗时
|
||||
* 修复基础统计 -> 4xx 数量中,把人机验证拦截也计入了的问题
|
||||
* 修复高级统计 -> 来源域名、来源页面中,把内部跳转也计入了的问题
|
||||
* 修复上游有多个域名时,获取不到正确 title 和 icon 的问题([#821](https://github.com/chaitin/SafeLine/issues/821))
|
||||
* 修复筛选 UI 错位问题([#789](https://github.com/chaitin/SafeLine/issues/789))
|
||||
* 修复其他一些已知问题
|
||||
|
||||
## [5.3.2] - 2024-04-12
|
||||
|
||||
### 修复
|
||||
* 修复了地理位置库识别错误的问题
|
||||
|
||||
### 优化
|
||||
* 优化了一些 UI 交互细节
|
||||
|
||||
## [5.3.1] - 2024-04-11
|
||||
|
||||
### 新增
|
||||
* 专业版支持*钉钉告警*
|
||||
* 专业版新增高级数据统计
|
||||
|
||||
### 优化
|
||||
* 上线新版智能 AI 攻击分析,分析结果由长亭问津安全大模型提供,大幅度提升安全分析效果
|
||||
* 支持全种类的攻击分析,包含 注入、CSRF、SSRF、后门等
|
||||
* 标准化输出内容,例如 攻击影响、意图分析、防护建议等
|
||||
* 优化站点上游服务器的格式校验([#792](https://github.com/chaitin/SafeLine/issues/792) 中涉及问题)
|
||||
* 修复了其他一些已知问题
|
||||
* 优化了一些 UI 交互细节
|
||||
|
||||
## [5.2.0] - 2024-03-28
|
||||
|
||||
### 新增
|
||||
|
||||
* 黑白名单、人机验证、身份认证中,规则匹配条件增加 “Method”(请求方法),方便对 POST、PUT、DELETE 等客户端操作进行限制
|
||||
* 攻击原始日志的防护模块为 “补充规则” 时,“命中规则” 处增加规则的 ID
|
||||
|
||||
### 优化
|
||||
|
||||
* 优化导航,调整功能位置,方便寻找:
|
||||
* 证书管理 移动到 防护站点->证书管理
|
||||
* IP 组 移动到 防护配置->通用配置->IP 组
|
||||
* 源 IP 获取方式、站点通用配置 移动到 防护站点->代理设置
|
||||
* 拦截页面附加说明、自定义拦截页面、IP 情报共享计划 移动到 防护配置->通用配置->拦截页面、IP 情报共享计划
|
||||
* 雷池控制台登录设置、雷池控制台证书、Syslog 设置、系统信息 移动到一级导航 系统设置
|
||||
* 密码登录框增加请求频率限制,提高暴力猜解的难度
|
||||
* 免费证书由过期前 10 天自动续期,改为过期前 30 天就自动续期
|
||||
* 修复站点数量较多时,站点管理处采集不到资源的问题
|
||||
* 修复移动端点击登录页的 “忘记密码” 无法弹出重置命令的问题
|
||||
* 修复 syslog 因请求内容较多被截断时,json 格式会被截得不合法的问题
|
||||
* 修复其他一些已知问题
|
||||
* 优化一些 UI 交互细节
|
||||
|
||||
## [5.1.0] - 2024-03-21
|
||||
|
||||
### 新增
|
||||
|
||||
- 专业版支持 syslog 转发攻击日志到外部服务器。
|
||||
|
||||
### 修复
|
||||
|
||||
- 修复某些情况下站点资源批量删除失败的问题。
|
||||
- 修复身份认证中配置 ip 组规则时功能异常的问题。
|
||||
- 修复某些攻击日志不显示地址位置的问题。
|
||||
- 修复页面缓存导致显示错误的问题。
|
||||
- 修复其他一些已知问题。
|
||||
|
||||
## [5.0.0] - 2024-03-14
|
||||
|
||||
### 新增
|
||||
|
||||
- 社区版支持密码登录。系统登录方式改为 密码+可选开启二步验证
|
||||
- 专业版
|
||||
- 支持添加多个用户
|
||||
- 支持导出攻击日志为 .csv 文件
|
||||
- 站点的负载均衡支持 IP Hash 算法、最小连接数算法
|
||||
|
||||
### 修复
|
||||
|
||||
- 修复 luigi 容器有时负载过高降不下来的问题
|
||||
- 修复其他一些已知问题
|
||||
|
||||
## [4.4.2] - 2024-03-09
|
||||
|
||||
### 修复
|
||||
|
||||
- 修复 FVM 服务在某些情况下 TCP 连接异常升高的问题
|
||||
|
||||
## [4.4.1] - 2024-03-07
|
||||
|
||||
### 优化
|
||||
|
||||
- 专业版支持在明亮主题和黑金主题之间切换
|
||||
- 优化人机验证([#693](https://github.com/chaitin/SafeLine/issues/693),云端更新,历史版本也生效)
|
||||
- 降低旋转图片的误差要求
|
||||
- 图片不容易对齐时,支持刷新图片
|
||||
- 修复一些低版本浏览器转不动图片的问题
|
||||
- 删除某些特别难对齐的图片
|
||||
- 优化一些界面 UI 和交互细节
|
||||
|
||||
### 修复
|
||||
|
||||
- 修复防护配置某些极端情况下会失效的问题
|
||||
- 修复向 luigi 发大量日志后,CPU 占用畸高不下的问题
|
||||
- 修复升级或重启后限频可能失效,直到修改任意防护配置的问题
|
||||
- 修复站点选择证书后再直接关闭 SSL,证书管理处 “使用站点” 仍然显示该站点的问题([#656](https://github.com/chaitin/SafeLine/issues/656))
|
||||
- 修复攻击事件页面中,允许把 IP 加入至内置 IP 组的问题
|
||||
- 修复其他一些已知问题
|
||||
|
||||
## [4.4.0] - 2024-02-29
|
||||
|
||||
### 新增
|
||||
|
||||
266
LICENSE.md
@@ -1,59 +1,241 @@
|
||||
## 软件许可证
|
||||
# 软件许可协议
|
||||
|
||||
本许可证(以下简称“许可证”)适用于您所获取的软件(以下简称“软件”),请您在使用本软件前仔细阅读以下条款。使用本软件表示您同意并接受本许可证的条款。
|
||||
本软件许可协议(以下简称"本协议")是您与北京长亭科技有限公司(以下简称"长亭")订立的具有法律约束力的协议,约束您对长亭发布的雷池社区版软件(以下简称"雷池")的安装与使用。**请您在使用本软件前仔细阅读以下条款,特别是免除或者限制责任的条款。安装、使用本软件表示您同意并接受本协议的条款。如果您不同意本协议条款,您应当立即卸载并停止使用雷池。**
|
||||
|
||||
1. **版权声明**
|
||||
本产品的所有代码、镜像、文件其版权均属于北京长亭科技有限公司。
|
||||
**【协议的有效期】** 本协议将持续有效,直至您卸载和删除您下载或控制的雷池社区版软件的所有副本。
|
||||
|
||||
2. **使用许可**
|
||||
在遵守本许可证条款的前提下,您有权在单一设备上安装、运行本软件,仅用于个人非商业目的。
|
||||
**【协议的修改与更新】** 长亭将不时对本协议予以更新,更新内容一经正式发布即成为本协议不可分割的组成部分。**在更新内容发布后继续使用雷池即表示您同意新的条款;如果您不同意新的条款,您应当卸载并停止使用雷池。**
|
||||
|
||||
3. **禁止事项**
|
||||
您不得对本软件进行以下行为:
|
||||
a) 破解、逆向工程、反编译、反汇编等行为;
|
||||
b) 二次包装、修改、改编、复制、翻译、再许可或制作衍生作品;
|
||||
c) 用于商业用途或任何盈利活动;
|
||||
d) 未经授权的传播、分发、出售、出租本软件;
|
||||
e) 将本软件与侵犯他人知识产权或违反法律法规的内容、行为结合。
|
||||
**【术语的翻译】** 如果长亭为您提供了这些条款的英文版本的翻译,您同意该翻译仅为您提供方便,并且这些条款的英文版本将同样约束您与长亭的关系。如果这些条款的中文版本与英文版本之间存在任何矛盾,以中文版本为准。
|
||||
|
||||
4. **保留权利**
|
||||
本软件的版权归原作者所有,除本许可证明确授权外,所有其他权利均由原作者保留。未经原作者明确授权,您不得行使本许可证未明确授权的其他权利。如超出授权使用,原作者保留追究法律责任的权利。
|
||||
**【许可范围】**
|
||||
|
||||
5. **免责声明**
|
||||
本软件按“现状”提供,不提供任何形式的保证,包括但不限于对适销性、适用于特定用途、无侵权等方面的保证。原作者对于因使用本软件而造成的任何损失、损害、诉讼等不承担责任。
|
||||
1. 在遵守本协议条款的前提下,您有权在单一设备上安装、运行本软件。
|
||||
|
||||
6. **终止条款**
|
||||
本许可证自您接受之日起生效,直至终止。如您未遵守本许可证的任何条款,原作者有权随时终止本许可证。一旦许可证终止,您必须停止使用本软件,并销毁您拥有或控制的所有副本。
|
||||
2. 雷池社区版软件是许可给您的,而非出售给您的。在本协议有效期内,并且在您遵守本协议的前提下,长亭授予您非排他性,不可转让,不可分配,不可再许可,可撤销的许可。
|
||||
|
||||
7. **适用法律与争议解决**
|
||||
本许可证受原作者所在国家或司法管辖区法律的约束并依据其解释。任何因本许可证引起的或与其相关的争议应通过协商解决。如协商无果,任何一方均可将争议提交原作者所在国家或司法管辖区的有管辖权的法院解决。
|
||||
**【知识产权声明】** 本软件的所有代码、镜像、文件其版权、商标等知识产权均属于北京长亭科技有限公司。
|
||||
|
||||
## License
|
||||
**【禁止事项】** 您不得、也不得促使、协助或授权他人对本软件进行以下行为:
|
||||
|
||||
This License (hereinafter referred to as "License") applies to the software you have obtained (hereinafter referred to as "Software"). Please read the following terms carefully before using the Software. Using the Software indicates your agreement and acceptance of the terms of this License.
|
||||
1. 破解、逆向工程、反编译、反汇编、转换为其他编程语言等以尝试获取本软件的源代码或本软件所产生的内在数据文件;
|
||||
|
||||
1. **Copyright Notice**
|
||||
All codes, images, and files of this product are copyrighted by Beijing Chaitin Future Technology Co.,Ltd
|
||||
2. 二次包装、修改、改编、复制、翻译、再许可或制作衍生作品;
|
||||
|
||||
2. **Usage Permission**
|
||||
Subject to compliance with the terms of this License, you are granted the right to install and run the Software on a single device for personal non-commercial purposes only.
|
||||
3. 出租、出售、再许可、分发、传播、直接共享、商品化、转让本软件;
|
||||
|
||||
3. **Prohibitions**
|
||||
You shall not engage in the following activities in relation to the Software:
|
||||
a) Cracking, reverse engineering, decompiling, disassembling, or other similar actions;
|
||||
b) Repackaging, modifying, adapting, copying, translating, sublicensing, or creating derivative works;
|
||||
c) Using for commercial purposes or any profit-making activities;
|
||||
d) Unauthorized dissemination, distribution, sale, or rental of the Software;
|
||||
e) Combining the Software with content or actions that infringe upon the intellectual property rights of others or violate laws and regulations.
|
||||
4. 解决或绕过本软件中的任何技术限制;
|
||||
|
||||
4. **Reservation of Rights**
|
||||
The copyright of the Software belongs to the original author. All other rights not expressly granted in this License are reserved by the original author. You may not exercise any other rights not expressly granted in this License without the explicit authorization of the original author.If used beyond the scope of the authorization, the original author reserves the right to pursue legal liability.
|
||||
5. 修改或删除本软件上关于本软件的版权声明、商标或其他知识产权声明;
|
||||
|
||||
5. **Disclaimers**
|
||||
The Software is provided "as is" without any warranties of any kind, including but not limited to warranties of merchantability, fitness for a particular purpose, or non-infringement. The original author shall not be liable for any loss, damage, litigation, or any other consequences resulting from the use of the Software.
|
||||
6. 以本软件为基础和主要技术能力输出物,提供商业化的云服务或网络服务;
|
||||
|
||||
6. **Termination**
|
||||
This License shall be effective upon your acceptance and shall continue in effect until terminated. The original author reserves the right to terminate this License at any time if you fail to comply with any of the terms and conditions of this License. Upon termination, you must cease all use of the Software and destroy all copies in your possession or control.
|
||||
7. 对本软件作出任何陈述或保证;
|
||||
|
||||
7. **Applicable Law and Dispute Resolution**
|
||||
This License shall be governed by and construed in accordance with the laws of the country or jurisdiction where the original author is located. Any disputes arising from or in connection with this License shall be resolved through negotiation. In case no settlement can be reached through negotiation, either party may submit the dispute to the competent court of the country or jurisdiction where the original author is located.
|
||||
8. 将本软件与侵犯他人知识产权或违反法律法规的内容、行为结合。例如:(1)利用本软件发表、传送、传播、储存违反国家法律、危害国家安全、社会稳定、公序良俗的内容,或任何不当的、侮辱诽谤的、淫秽的、暴力的及任何违反国家法律法规政策的内容;(2)违法使用本软件,包括但不限于侵犯、挪用或以其他方式侵犯任何第三方的任何合法权利。
|
||||
|
||||
**【免责声明】**
|
||||
|
||||
**本软件是按照现有技术和条件所能达到的现状提供的,长亭不提供任何形式的保证,** 包括但不限于:
|
||||
|
||||
1. 对于因使用或无法使用本软件而造成的任何直接、间接、附带、特殊或重大损害、利润损失或业务中断,长亭不承担任何责任,即使长亭已被告知相关损害;
|
||||
|
||||
2. 长亭无组织本软件的交流社区的义务与责任,不承担因技术交流导致某一方故障而产生的经济损失以及相关责任;
|
||||
|
||||
3. 长亭不对本软件的无故障、适用性、可用性、准确性、质量满意度等做任何形式的保证;
|
||||
|
||||
4. 长亭不保证该本软件可以满足您的要求,也不保证其操作不会中断或没有错误,或者将纠正缺陷;
|
||||
|
||||
5. 长亭对本软件提供的任何信息或建议均不构成任何担保;
|
||||
|
||||
6. 用户因使用本软件违反国家法律法规的,长亭不承担任何责任。
|
||||
|
||||
**【软件的获取】** 您可直接从长亭官方认证的渠道获取本软件。如果您从非长亭官方认证的第三方获取本软件或与本软件名称相同的安装程序,长亭无法保证该软件能够正常使用,并对因此给您造成的损失不承担责任。
|
||||
|
||||
**【软件的更新】** 为了完善用户体验,增强雷池社区版软件的功能及性能,长亭将会不断努力开发新的功能,并为您不定期提供软件更新。新版本发布后,旧版本的软件可能无法使用。长亭不保证旧版雷池社区版软件的稳定性和可使用性,请您随时核对并下载最新版本。
|
||||
|
||||
**【信息收集】** 在本软件安装和使用的过程中,长亭将收集部分数据和信息,如本软件的版本、语言、IP地址等,但长亭不会收集个人身份信息、个人生物识别信息等足以识别出特定自然人的信息,长亭仅将收集的信息用于确认您使用的雷池版本情况和雷池功能板块的使用频率,从而改善和优化软件功能。
|
||||
|
||||
**【数据安全保证】** 长亭在使用过程中不会收集、传输、存储其安装载体中的具体数据,您需要自行负责您的数据安全与备份。您理解并同意长亭无法提供找回丢失数据等服务。
|
||||
|
||||
**【权利保留】** 本软件的版权归长亭所有,除本协议明确授权外,所有其他权利均由长亭保留。未经长亭明确授权,您不得行使本协议未明确授权的其他权利。如超出授权使用,长亭保留追究法律责任的权利。
|
||||
|
||||
**【责任范围】** 在法律允许的最大范围内,在任何情况下,长亭均不对任何直接的,附带的,特殊的,间接的或后果性的损失或利润损失,数据损失,商誉损失,业务中断或任何其他形式的损失负责,对由您的使用或无法使用雷池社区版软件引起或与之相关的其他损害或损失概不负责。
|
||||
|
||||
**【法律适用与争议解决】** 本协议受中华人民共和国大陆地区(不含港澳台地区)法律管辖,并按之解释。因本协议引起的或与本协议有关的任何争议应优先通过协商解决。如协商无果,任何一方可将争议提交长亭所在地人民法院通过诉讼方式解决。
|
||||
|
||||
**【条款可分离】** 如本协议的任何条款被视作无效或无法执行,则上述条款可被分离,其余部分则仍具有法律效力。
|
||||
|
||||
**【专业版】** 雷池商业/企业版本(非社区版)的权利受单独条款的约束。
|
||||
|
||||
### The license agreement
|
||||
|
||||
This software license agreement (hereinafter referred to as \"the
|
||||
agreement\") is a legally binding agreement between you and Beijing
|
||||
Chaitin Technology Co., Ltd (hereinafter referred to as \"Chaitin\"),
|
||||
which governs your installation and use of the Leichi Community Edition
|
||||
software (hereinafter referred to as \"Leichi\") released by Chaitin.
|
||||
**Please read the following terms carefully before using this software,
|
||||
especially the terms disclaiming or limiting liability. Installing and
|
||||
using this software indicates your agreement and acceptance of the terms
|
||||
of this agreement. If you do not agree to the terms of this agreement,
|
||||
you should immediately uninstall and stop using Leichi.**
|
||||
|
||||
**\[Validity of the Agreement\]** This Agreement will remain in effect
|
||||
until you uninstall and delete all copies of the Leichi Community
|
||||
Edition software you downloaded or controlled.
|
||||
|
||||
**\[Modification and update of the agreement\]** Chaitin will update
|
||||
this agreement from time to time, and the updated content will become an
|
||||
integral part of this agreement once it is officially released.
|
||||
**Continuing to use Leichi after the updated content is released means
|
||||
that you agree to the new terms; if you do not agree to the new terms,
|
||||
you should uninstall and stop using Leichi.**
|
||||
|
||||
**\[Translation of Terms\]** If Chaitin provides you with a translation
|
||||
of the English version of these Terms, you agree that the translation is
|
||||
only for your convenience, and the English version of these Terms will
|
||||
also govern your relationship with Chaitin. If there is any conflict
|
||||
between the Chinese version and the English version of these Terms, the
|
||||
Chinese version shall prevail.
|
||||
|
||||
**\[Permission Scope\]**
|
||||
|
||||
1. Subject to the terms of this agreement, you have the right to
|
||||
install and run this software on a single device.
|
||||
|
||||
2. Leichi Community Edition software is licensed to you, not sold to you.
|
||||
During the term of this Agreement and on the premise that you comply
|
||||
with this Agreement, Chaitin grants you a non-exclusive,
|
||||
non-transferable, non-assignable, non-sublicensable, revocable license.
|
||||
|
||||
**\[Intellectual Property Statement\]** The copyright, trademark and
|
||||
other intellectual property rights of all codes, images and files of
|
||||
this software belong to Beijing Chaitin Technology Co., Ltd.
|
||||
|
||||
**\[Prohibited Behavior\]** You may not, nor may you prompt, assist or
|
||||
authorize others to perform the following actions on this software:
|
||||
|
||||
1. Crack, reverse engineer, decompile, disassemble, convert to other
|
||||
programming languages, etc. in an attempt to obtain the source code of
|
||||
the software or the inherent data files generated by the software;
|
||||
|
||||
2. Repackage, modify, adapt, copy, translate, sublicense or create
|
||||
derivative works;
|
||||
|
||||
3. Rent, sell, sublicense, distribute, disseminate, directly share,
|
||||
commercialize, and transfer this software;
|
||||
|
||||
4. Solve or bypass any technical limitations in the software;
|
||||
|
||||
5. Modify or delete the copyright statement, trademark or other
|
||||
intellectual property statement regarding this software on the software;
|
||||
|
||||
6. Provide commercial cloud services or network services based on this
|
||||
software and the main technical capability output;
|
||||
|
||||
7. Make any representation or warranty regarding the Software;
|
||||
|
||||
8. Combine this software with content or behavior that infringes on the
|
||||
intellectual property rights of others or violates laws and regulations.
|
||||
For example: (1) Use this software to publish, transmit, disseminate,
|
||||
and store content that violates national laws, endangers national
|
||||
security, social stability, public order and good morals, or any
|
||||
inappropriate, insulting, defamatory, obscene, violent, or anything that
|
||||
violates national laws and regulations The content of the policy; (2)
|
||||
Illegal use of this software, including but not limited to infringement,
|
||||
misappropriation or other infringement of any legal rights of any third
|
||||
party.
|
||||
|
||||
**\[Disclaimer\]**
|
||||
|
||||
**This software is provided according to the status quo that the
|
||||
existing technology and conditions can achieve. Chaitin does not provide
|
||||
any form of guarantee,** including but not limited to:
|
||||
|
||||
1. Chaitin does not assume any responsibility for any direct, indirect,
|
||||
incidental, special or significant damages, loss of profits or business
|
||||
interruption caused by the use or inability to use this software, even
|
||||
if Chaitin has been informed of the relevant damages;
|
||||
|
||||
2. Chaitin has no obligation or responsibility to organize a
|
||||
communication community for this software, and does not assume any
|
||||
economic losses or related responsibilities arising from the failure of
|
||||
any party due to technical exchanges;
|
||||
|
||||
3. Chaitin does not make any form of guarantee regarding the
|
||||
fault-freeness, applicability, availability, accuracy, quality
|
||||
satisfaction, etc. of this software;
|
||||
|
||||
4. Chaitin does not guarantee that the software can meet your
|
||||
requirements, nor does it guarantee that its operation will be
|
||||
uninterrupted or error-free, or that defects will be corrected;
|
||||
|
||||
5. Any information or suggestions provided by Chaitin does not
|
||||
constitute any guarantee for this software;
|
||||
|
||||
6. Chaitin does not assume any responsibility if the user violates
|
||||
national laws and regulations by using this software.
|
||||
|
||||
**\[Acquisition of software\]** You can obtain this software directly
|
||||
from Chaitin's official certified channels. If you obtain this software
|
||||
or an installation program with the same name as this software from a
|
||||
third party that is not officially certified by Chaitin, Chaitin cannot
|
||||
guarantee that the software can be used normally and is not responsible
|
||||
for any losses caused to you.
|
||||
|
||||
**\[Software Updates\]** In order to improve the user experience and
|
||||
enhance the functions and performance of the Leichi Community Edition
|
||||
software, Chaitin will continue to work hard to develop new features and
|
||||
provide you with software updates from time to time. After a new version
|
||||
is released, older versions of the software may become unusable. Chaitin
|
||||
does not guarantee the stability and usability of the old version of the
|
||||
Leichi Community Edition software. Please check and download the latest
|
||||
version at any time.
|
||||
|
||||
**\[Information Collection\]** During the installation and use of this
|
||||
software, Chaitin will collect some data and information, such as the
|
||||
version of the software, language, IP address, etc., but Chaitin will
|
||||
not collect personal identity information, personal biometric
|
||||
information, etc. that are sufficient to identify To obtain the
|
||||
information of specific natural persons, Chaitin will only use the
|
||||
collected information to confirm the version of Leichi you are using and
|
||||
the frequency of use of the Leichi function section, so as to improve
|
||||
and optimize the software functions.
|
||||
|
||||
**\[Data Security Guarantee\]** Chaitin will not collect, transmit, or
|
||||
store specific data in its installation carrier during use. You are
|
||||
responsible for the security and backup of your data. You understand and
|
||||
agree that Chaitin cannot provide services such as retrieval of lost
|
||||
data.
|
||||
|
||||
**\[Rights reserved\]** The copyright of this software belongs to
|
||||
Chaitin. Except as expressly authorized by this agreement, all other
|
||||
rights are reserved by Chaitin. Without express authorization from
|
||||
Chaitin, you may not exercise other rights not expressly authorized by
|
||||
this Agreement. If the use exceeds the authorized use, Chaitin reserves
|
||||
the right to pursue legal liability.
|
||||
|
||||
**\[Scope of Liability\]** To the maximum extent permitted by law, under
|
||||
no circumstances shall Chaitin be liable for any direct, incidental,
|
||||
special, indirect or consequential losses or loss of profits, loss of
|
||||
data, loss of goodwill, business interruption or any other form of loss,
|
||||
and is not responsible for other damages or losses arising out of or
|
||||
related to your use of or inability to use the Leichi Community Edition
|
||||
software.
|
||||
|
||||
**\[Law Application and Dispute Resolution\]** This agreement shall be
|
||||
governed by and construed in accordance with the laws of the mainland of
|
||||
the People\'s Republic of China (excluding Hong Kong, Macao and Taiwan).
|
||||
Any disputes arising out of or in connection with this Agreement shall
|
||||
be resolved first through negotiation. If the negotiation fails, either
|
||||
party may submit the dispute to the People\'s Court where Chaitin is
|
||||
located for settlement through litigation.
|
||||
|
||||
**\[Terms can be severed\]** If any term of this agreement is deemed to
|
||||
be invalid or unenforceable, the above terms can be severed and the
|
||||
remaining parts will still have legal effect.
|
||||
|
||||
**\[Professional Edition\]** The rights of the Leichi
|
||||
commercial/enterprise version (non-community version) are subject to
|
||||
separate terms.
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package handler
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
@@ -62,3 +63,44 @@ func (h *SafelineHandler) Exist(c *gin.Context) {
|
||||
}
|
||||
c.JSON(200, gin.H{"ip": ip})
|
||||
}
|
||||
|
||||
type BehaviorReq struct {
|
||||
Source string `json:"source"`
|
||||
Type service.BehaviorType `json:"type"`
|
||||
}
|
||||
|
||||
// Behavior record user behavior
|
||||
// @Summary record user behavior
|
||||
// @Description record user behavior
|
||||
// @Tags Safeline
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Param body body BehaviorReq true "body"
|
||||
// @Success 200 {object} string
|
||||
// @Router /behavior [post]
|
||||
func (h *SafelineHandler) Behavior(c *gin.Context) {
|
||||
req := &BehaviorReq{}
|
||||
if err := c.BindJSON(req); err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
||||
return
|
||||
}
|
||||
|
||||
if req.Type >= service.BehaviorTypeMax || req.Type <= service.BehaviorTypeMin {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": "invalid behavior type"})
|
||||
return
|
||||
}
|
||||
|
||||
byteReq, err := json.Marshal(req)
|
||||
if err != nil {
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
|
||||
return
|
||||
}
|
||||
|
||||
err = h.safelineService.PostBehavior(c, byteReq)
|
||||
if err != nil {
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
|
||||
return
|
||||
}
|
||||
|
||||
c.JSON(200, gin.H{})
|
||||
}
|
||||
|
||||
@@ -1,12 +1,11 @@
|
||||
package service
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"crypto/tls"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"net/http"
|
||||
"strings"
|
||||
)
|
||||
@@ -33,25 +32,50 @@ func NewSafelineService(host string) *SafelineService {
|
||||
}
|
||||
}
|
||||
|
||||
type response[T any] struct {
|
||||
Code int `json:"code"`
|
||||
Data T `json:"data"`
|
||||
}
|
||||
|
||||
func (s *SafelineService) request(req *http.Request, data any) error {
|
||||
res, err := s.client.Do(req)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer res.Body.Close()
|
||||
|
||||
if res.StatusCode != http.StatusOK {
|
||||
return fmt.Errorf("request failed, status_code: %d", res.StatusCode)
|
||||
}
|
||||
|
||||
if data == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
err = json.NewDecoder(res.Body).Decode(data)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *SafelineService) GetInstallerCount(ctx context.Context) (InstallerCount, error) {
|
||||
req, err := http.NewRequestWithContext(ctx, http.MethodGet, s.APIHost+"/api/v1/public/safeline/count", nil)
|
||||
if err != nil {
|
||||
return cacheCount, err
|
||||
}
|
||||
res, err := s.client.Do(req)
|
||||
if err != nil {
|
||||
return cacheCount, err
|
||||
}
|
||||
defer res.Body.Close()
|
||||
var r map[string]interface{}
|
||||
if err := json.NewDecoder(res.Body).Decode(&r); err != nil {
|
||||
return cacheCount, err
|
||||
}
|
||||
if r["code"].(float64) != 0 {
|
||||
|
||||
var r response[struct {
|
||||
Total int `json:"total"`
|
||||
}]
|
||||
|
||||
err = s.request(req, &r)
|
||||
if r.Code != 0 {
|
||||
return cacheCount, nil
|
||||
}
|
||||
cacheCount = InstallerCount{
|
||||
Total: int(r["data"].(map[string]interface{})["total"].(float64)),
|
||||
Total: r.Data.Total,
|
||||
}
|
||||
return cacheCount, nil
|
||||
}
|
||||
@@ -63,21 +87,41 @@ func (s *SafelineService) GetExist(ctx context.Context, id string, token string)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
res, err := s.client.Do(req)
|
||||
|
||||
var r response[struct {
|
||||
IP string `json:"ip"`
|
||||
}]
|
||||
|
||||
err = s.request(req, &r)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
defer res.Body.Close()
|
||||
if res.StatusCode != http.StatusOK {
|
||||
raw, _ := io.ReadAll(res.Body)
|
||||
return "", errors.New(string(raw))
|
||||
}
|
||||
var r map[string]interface{}
|
||||
if err := json.NewDecoder(res.Body).Decode(&r); err != nil {
|
||||
return "", err
|
||||
}
|
||||
if r["code"].(float64) != 0 {
|
||||
|
||||
if r.Code != 0 {
|
||||
return "", nil
|
||||
}
|
||||
return r["data"].(map[string]interface{})["ip"].(string), nil
|
||||
return r.Data.IP, nil
|
||||
}
|
||||
|
||||
type BehaviorType uint64
|
||||
|
||||
const (
|
||||
BehaviorTypeMin BehaviorType = iota + 1000
|
||||
BehaviorTypePurchase
|
||||
BehaviorTypeConsult
|
||||
BehaviorTypeMax
|
||||
)
|
||||
|
||||
func (s *SafelineService) PostBehavior(ctx context.Context, body []byte) error {
|
||||
req, err := http.NewRequestWithContext(ctx, http.MethodPost, s.APIHost+"/api/v1/public/safeline/behavior", bytes.NewReader(body))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err = s.request(req, nil)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -54,6 +54,7 @@ func main() {
|
||||
safelineHandler := handler.NewSafelineHandler(safelineService)
|
||||
v1.GET("/safeline/count", safelineHandler.GetInstallerCount)
|
||||
v1.POST("/exist", safelineHandler.Exist)
|
||||
v1.POST("/behavior", safelineHandler.Behavior)
|
||||
|
||||
docs.SwaggerInfo.BasePath = v1.BasePath()
|
||||
r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerfiles.Handler))
|
||||
|
||||
@@ -6,11 +6,23 @@ title: "登录雷池"
|
||||
|
||||
> TOTP (Time-based One-Time Password algorithm) 将密钥与当前时间进行组合,通过哈希算法产生一次性密码,已被采纳为 RFC 6238,被用于许多双因素身份验证系统。
|
||||
|
||||
## 登录演示
|
||||
## 登录流程
|
||||
|
||||
浏览器打开后台管理页面 `https://<waf-ip>:9443`。
|
||||
1.浏览器打开后台管理页面 `https://<waf-ip>:9443`。
|
||||
|
||||
根据界面提示,使用 **支持 TOTP 的认证软件或者小程序** 扫描二维码,然后输入动态口令登录:
|
||||
2.输入初始的admin密码
|
||||
|
||||
完成安装后在shell会自动输出密码。
|
||||
|
||||

|
||||
|
||||
若忘记查看,需手动执行重置命令获得初始密码
|
||||
|
||||
`docker exec safeline-mgt resetadmin`
|
||||
|
||||

|
||||
|
||||
3.根据界面提示,使用 **支持 TOTP 的认证软件或者小程序** 扫描二维码,然后输入动态口令登录:
|
||||
|
||||
<iframe src="//player.bilibili.com/player.html?aid=748637002&bvid=BV1wC4y177zN&cid=1339420830&p=1&autoplay=0" scrolling="no" border="0" frameBorder="no" framespacing="0" allowFullScreen='{true}'
|
||||
style={{ width: '100%', height: '350px' }}
|
||||
|
||||
@@ -22,7 +22,7 @@ title: "购买专业版"
|
||||
|
||||
### 按需购买
|
||||
|
||||
进入应用后点击购买,根据需求完成购买
|
||||
进入应用后点击购买,根据需求完成购买,如有开票需求单独找社区管理
|
||||
|
||||

|
||||
|
||||
@@ -48,6 +48,8 @@ title: "购买专业版"
|
||||
|
||||
## 使用云托管自动进行授权
|
||||
|
||||
什么是雷池云托管?请参考 [雷池云托管](/practice/safeline-cloud)
|
||||
|
||||
### 获取云托管安装命令
|
||||
|
||||
点击获取云托管的安装命令
|
||||
@@ -58,7 +60,6 @@ title: "购买专业版"
|
||||
|
||||
### 完成云托管安装
|
||||
|
||||
|
||||
完成安装后可以看到设备的基本信息
|
||||
|
||||

|
||||
|
||||
@@ -103,6 +103,24 @@ title: "配置站点"
|
||||
|
||||

|
||||
|
||||
|
||||
## 高级防护
|
||||
|
||||
新版本增加单个站点的高级防护配置,支持对单个站点进行额外的防护配置
|
||||
|
||||
注意:自定义规则不受到当前开关影响
|
||||
|
||||

|
||||
|
||||
### 人机验证
|
||||
|
||||
点击后可以开启单个站点的人机验证
|
||||
|
||||
### 身份认证
|
||||
|
||||
点击可以为当前站点额外配置一个身份认证规则
|
||||
|
||||
|
||||
## 常见配置问题
|
||||
|
||||
请参考 [配置问题](/faq/config)
|
||||
|
||||
@@ -61,14 +61,20 @@ title: "测试防护"
|
||||
3. 使用以下请求开始测试
|
||||
|
||||
```
|
||||
./blazehttp -t http://<IP或域名>:<端口>
|
||||
./选择对应版本 -t http://<IP或域名>:<端口>
|
||||
|
||||
windows下
|
||||
./blazehttp_windows.exe -t http://<IP或域名>:<端口>
|
||||
|
||||
linux下
|
||||
./blazehttp_linux_x64 -t http://<IP或域名>:<端口>
|
||||
```
|
||||
|
||||
### 测试效果展示
|
||||
|
||||
```sh
|
||||
# 测试请求
|
||||
.//blazehttp -t http://127.0.0.1:8008
|
||||
# linux测试请求演示
|
||||
./blazehttp -t http://127.0.0.1:8008
|
||||
sending 100% |█████████████████████████████████████████████████████████| (33669/33669, 940 it/s) [35s:0s]
|
||||
总样本数量: 33669 成功: 33669 错误: 0
|
||||
检出率: 71.65% (恶意样本总数: 575 , 正确拦截: 412 , 漏报放行: 163)
|
||||
|
||||
@@ -6,53 +6,21 @@ title: "配置其他"
|
||||
|
||||
其他配置项介绍
|
||||
|
||||
### 黑白名单
|
||||
|
||||
黑名单:拦截
|
||||
|
||||
白名单:放通
|
||||
|
||||
注意:条件 AND 是指同时符合,如果希望多个匹配条件需要增加多条黑名单或者白名单
|
||||
|
||||

|
||||
|
||||
### 频率限制
|
||||
|
||||
通过开启频率限制功能封锁恶意 IP
|
||||
|
||||

|
||||
|
||||
### 人机验证
|
||||
|
||||
人机验证的有效时间默认是一个小时,未来可能会支持配置,敬请期待
|
||||
|
||||
详情查看 [人机验证 2.0](/about/challenge)
|
||||
|
||||
### 语义分析
|
||||
|
||||
详情查看 [语义分析检测算法](/about/syntaxanalysis)
|
||||
|
||||
## 通用配置
|
||||
|
||||
### IP 组配置
|
||||
|
||||
1.支持自定义 IP 组
|
||||
|
||||
2.长亭社区恶意 IP 情报,需要加入 IP 情报共享计划才可以使用
|
||||
## 防护站点
|
||||
|
||||
### 证书管理
|
||||
|
||||
管理需要使用的证书,点击添加证书添加
|
||||
|
||||
### 其他
|
||||
### 代理配置
|
||||
|
||||
#### 源 ip 获取方式
|
||||
|
||||
1.使用默认的方式获取源 IP
|
||||
|
||||
2.自定义获取源 IP 的 header
|
||||
2.自定义获取源 IP 的 header
|
||||
|
||||
#### 站点通用配置
|
||||
#### 其他代理配置
|
||||
|
||||
1.如果配置站点需要 http 自动转为 https 功能时,需要手动开启
|
||||
|
||||
@@ -64,17 +32,186 @@ title: "配置其他"
|
||||
|
||||
注:开启后并不会遵循源请求的信息,雷池会覆盖,为防止客户端伪造
|
||||
|
||||
#### 拦截页面附加说明
|
||||
## 防护配置
|
||||
|
||||
自定义拦截页面的提示信息
|
||||
### 自定义规则
|
||||
|
||||
新版本自定义规则把原黑白名单、人机验证、身份认证都合并一起管理,可以通过页面进行筛选
|
||||
|
||||
|
||||

|
||||
|
||||
#### 类型:黑、白名单
|
||||
|
||||
黑名单:拦截
|
||||
|
||||
白名单:放通,优先级大于黑名单
|
||||
|
||||
注意:条件 AND 是指同时符合,如果希望多个匹配条件需要增加多条黑名单或者白名单
|
||||
|
||||
#### 类型:人机验证
|
||||
|
||||
人机验证的有效时间默认是一个小时,未来可能会支持配置,敬请期待。
|
||||
|
||||
详情查看 [人机验证 2.0](/about/challenge)
|
||||
|
||||
#### 类型:身份认证
|
||||
|
||||
可以通过添加认证规则,对雷池保护的站点额外增加身份认证功能。
|
||||
|
||||

|
||||
|
||||
如图,触发身份认证规则后需要使用账户密码登录后继续访问网站。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
### 频率限制
|
||||
|
||||
通过开启频率限制功能封锁恶意 IP
|
||||
|
||||
对已经限制的ip可以在限频日志页面点击解除限制进行放行
|
||||
|
||||

|
||||
|
||||
|
||||
### 语义分析
|
||||
|
||||
详情查看 [语义分析检测算法](/about/syntaxanalysis)
|
||||
|
||||
### 补充规则(专业版)
|
||||
|
||||
补充规则能在语义分析的基础上,针对一些特殊的业务漏洞、框架漏洞的利用行为进行防护。
|
||||
|
||||
社区版默认进行平衡防护,专业版可进一步配置防护模式。
|
||||
|
||||

|
||||
|
||||
|
||||
### 通用配置
|
||||
|
||||
#### IP 组
|
||||
|
||||
1.支持自定义 IP 组
|
||||
|
||||
2.长亭社区恶意 IP 情报,需要加入 IP 情报共享计划才可以使用
|
||||
|
||||
|
||||
#### 拦截页面
|
||||
|
||||
1.自定义拦截页面的提示信息
|
||||
|
||||
2.自定义拦截页面(专业版),可以修改替或换拦截页面
|
||||
|
||||
#### 攻击告警(专业版)
|
||||
|
||||
支持钉钉、飞书、企业微信
|
||||
|
||||
支持发送(攻击、频率限制)告警到钉钉
|
||||
|
||||
#### IP 情报共享计划
|
||||
|
||||
默认加入共享计划,加入后将共享攻击 IP 信息到社区,并可使用 IP 组 “长亭社区恶意 IP 情报”。
|
||||
|
||||
## 系统设置
|
||||
|
||||
#### 雷池控制台登录设置
|
||||
|
||||
用于配置登录雷池管理端的方式
|
||||
|
||||
低于5.0.0版本升级上来的,shell会显示初始密码,忘记可以手动重置
|
||||
|
||||
社区版支持单用户,**专业版**支持多用户管理
|
||||
|
||||
管理员固定为 admin,非管理员不能修改其他用户配置
|
||||
|
||||
#### 雷池控制台证书
|
||||
|
||||
存放默认证书,可以自定义证书
|
||||
|
||||
#### IP 情报共享计划
|
||||
#### Syslog 设置
|
||||
|
||||
默认加入共享计划,加入后将共享攻击 IP 信息到社区,并可使用 IP 组 “长亭社区恶意 IP 情报”
|
||||
让雷池发送syslog到设置的服务器,**当前只支持UDP协议**
|
||||
|
||||

|
||||
|
||||
保存信息后可以点击测试按钮测试,收到测试信息表示配置成功
|
||||
|
||||
雷池发现攻击事件后,会发送事件的syslog信息
|
||||
|
||||

|
||||
|
||||
```
|
||||
#syslog 内容详情
|
||||
{
|
||||
"scheme": "http", // 请求协议为 HTTP
|
||||
"src_ip": "12.123.123.123", // 源 IP 地址
|
||||
"src_port": 53008, // 源端口号
|
||||
"socket_ip": "10.2.71.103", // Socket IP 地址
|
||||
"upstream_addr": "10.2.34.20", // 上游地址
|
||||
"req_start_time": 1712819316749, // 请求开始时间
|
||||
"rsp_start_time": null, // 响应开始时间
|
||||
"req_end_time": 1712819316749, // 请求结束时间
|
||||
"rsp_end_time": null, // 响应结束时间
|
||||
"host": "safeline-ce.chaitin.net",// 主机名
|
||||
"method": "GET", // 请求方法为 GET
|
||||
"query_string": "", // 查询字符串
|
||||
"event_id": "32be0ce3ba6c44be9ed7e1235f9eebab", // 事件 ID
|
||||
"session": "", // 会话
|
||||
"site_uuid": "35", // 站点 UUID
|
||||
"site_url": "http://safeline-ce.chaitin.net:8083", // 站点 URL
|
||||
"req_detector_name": "1276d0f467e4", // 请求检测器名称
|
||||
"req_detect_time": 286, // 请求检测时间
|
||||
"req_proxy_name": "16912fe30d8f", // 请求代理名称
|
||||
"req_rule_id": "m_rule/9bf31c7ff062936a96d3c8bd1f8f2ff3", // 请求规则 ID
|
||||
"req_location": "urlpath", // 请求位置为 URL 路径
|
||||
"req_payload": "", // 请求负载为空
|
||||
"req_decode_path": "", // 请求解码路径
|
||||
"req_rule_module": "m_rule", // 请求规则模块为 m_rule
|
||||
"req_http_body_is_truncate": 0, // 请求 HTTP 主体
|
||||
"rsp_http_body_is_truncate": 0, // 响应 HTTP 主体
|
||||
"req_skynet_rule_id_list": [ // 请求 Skynet 规则 ID 列表
|
||||
65595,
|
||||
65595
|
||||
],
|
||||
"http_body_is_abandoned": 0, // HTTP 主体
|
||||
"country": "US", // 国家
|
||||
"province": "", // 省份
|
||||
"city": "", // 城市
|
||||
"timestamp": 1712819316, // 时间戳
|
||||
"payload": "",
|
||||
"location": "urlpath", // 位置为 URL 路径
|
||||
"rule_id": "m_rule/9bf31c7ff062936a96d3c8bd1f8f2ff3", / 规则 ID
|
||||
"decode_path": "", // 解码路径
|
||||
"cookie": "sl-session=Z0WLa8mjGGZPki+QHX+HNQ==", // Cookie
|
||||
"user_agent": "PostmanRuntime/7.28.4", // 用户代理
|
||||
"referer": "", // 引用页
|
||||
"timestamp_human": "2024-04-11 15:08:36", // 时间戳
|
||||
"resp_reason_phrase": "", // 响应
|
||||
"module": "m_rule", // 模块为 m_rule
|
||||
"reason": "", // 原因
|
||||
"proxy_name": "16912fe30d8f", // 代理名称
|
||||
"node": "1276d0f467e4", // 节点
|
||||
"dest_port": 8083, // 目标端口号
|
||||
"dest_ip": "10.2.34.20", // 目标 IP 地址
|
||||
"urlpath": "/webshell.php", // URL 路径
|
||||
"protocol": "http", // 协议为 HTTP
|
||||
"attack_type": "backdoor", // 攻击类型
|
||||
"risk_level": "high", // 风险级别
|
||||
"action": "deny", // 动作
|
||||
"req_header_raw": "GET /webshell.php HTTP/1.1\r\nHost: safeline-ce.chaitin.net:8083\r\nUser-Agent: PostmanRuntime/7.28.4\r\nAccept: */*\r\nAccept-Encoding: gzip, deflate, br\r\nCache-Control: no-cache\r\nCookie: sl-session=Z0WLa8mjGGZPki+QHX+HNQ==\r\nPostman-Token: 8e67bec1-6e79-458c-8ee5-0498f3f724db\r\nX-Real-Ip: 12.123.123.123\r\nSL-CE-SUID: 35\r\n\r\n", // 请求头原始内容
|
||||
"body": "", // 主体
|
||||
"req_block_reason": "web", // 请求阻止原因
|
||||
"req_attack_type": "backdoor", // 请求攻击类型
|
||||
"req_risk_level": "high", // 请求风险级别
|
||||
"req_action": "deny" // 动作
|
||||
}
|
||||
```
|
||||
|
||||
#### 系统信息
|
||||
|
||||
显示系统版本和设备机器码
|
||||
|
||||
## 常见配置问题
|
||||
|
||||
|
||||
@@ -26,9 +26,8 @@ title: "安装问题"
|
||||
|
||||
需要安装 docker。尝试 `curl -fLsS https://get.docker.com/ | sh` 或者 [Install Docker Engine](https://docs.docker.com/engine/install/)。
|
||||
|
||||
#### 报错:docker not found, unable to deploy
|
||||
#### 报错:failed to create network safeline-ce
|
||||
|
||||
failed to create network safeline-ce
|
||||
safeline-ce 是雷池部署时候创建的 network,出现类似报错,先重启下 dockerd 之后重试
|
||||
|
||||
需要启动 docker daemon 才能执行相关的命令。尝试 `systemctl start docker`。
|
||||
@@ -37,10 +36,6 @@ safeline-ce 是雷池部署时候创建的 network,出现类似报错,先重
|
||||
|
||||
需要安装 `docker compose v2`。尝试 `[Install Docker Compose](https://docs.docker.com/compose/install/)`。
|
||||
|
||||
#### 报错: `failed to create network safeline-ce`
|
||||
|
||||
safeline-ce 是雷池部署时候创建的 network,出现类似报错,先重启下 dockerd 之后重试。
|
||||
|
||||
#### 报错: safeline-tengine 出现 Address already in use
|
||||
|
||||
`docker logs -f safeline-tengine` 容器日志中看到 `Address already in use` 信息。
|
||||
@@ -103,8 +98,11 @@ security_opt:
|
||||
|
||||
在安装目录(默认 safeline)下
|
||||
|
||||
根据本地的compose版本,执行 `docker compose down` 或者 `docker-compose down`
|
||||
1.根据本地的compose版本,执行 `docker compose down` 或者 `docker-compose down` 停止容器
|
||||
|
||||
2.手动删除镜像
|
||||
|
||||
3.动手删除目录
|
||||
|
||||
|
||||
## 问题无法解决
|
||||
|
||||
@@ -6,6 +6,16 @@ title: "登录问题"
|
||||
|
||||
记录常见的登录问题
|
||||
|
||||
## admin密码错误
|
||||
|
||||
### 使用命令重置
|
||||
|
||||
需手动执行重置命令获得初始密码
|
||||
|
||||
```
|
||||
docker exec safeline-mgt resetadmin
|
||||
```
|
||||
|
||||
## 动态口令错误
|
||||
|
||||
### 时间不一致
|
||||
@@ -30,7 +40,7 @@ TOTP 动态口令只有 30 秒的有效期,如果认证失败,请在动态
|
||||
命令执行完成后打开雷池页面重新绑定即可。
|
||||
|
||||
```
|
||||
docker exec safeline-mgt resetadmin
|
||||
docker exec safeline-mgt resettotp
|
||||
```
|
||||
|
||||
**注意:重置动态口令后要尽快完成绑定,别被其他人捷足先登了。**
|
||||
|
||||
@@ -81,10 +81,16 @@ title: "配置问题"
|
||||
|
||||
## 配置完成后,测试时返回 400 Request Header Or Cookie Too Large
|
||||
|
||||
请麻烦检查是否形成了环路,即:雷池将请求转发给上游服务器后,上游服务器又将请求转发回雷池。
|
||||
检查是否形成了环路,即:雷池将请求转发给上游服务器后,上游服务器又将请求转发回雷池。
|
||||
|
||||
重新修改配置后再次测试
|
||||
|
||||
## 不同版本关闭防火墙的命令
|
||||
|
||||
默认使用雷池不需要关闭防火墙,配置对应的开放规则即可
|
||||
|
||||
如果需要直接关闭防火墙可以参考
|
||||
|
||||
Ubuntu 18.04 LTS 、 Ubuntu 20.04 LTS 、 Ubuntu 22.04 LTS
|
||||
|
||||
Debian 9 (Stretch)、Debian 10 (Buster)、Debian 11 (Bullseye)
|
||||
|
||||
@@ -45,6 +45,22 @@ docker exec safeline-tengine nginx -s reload
|
||||
|
||||
**_注意:该操作会加快对硬盘的消耗,请定时清理访问日志_**
|
||||
|
||||
## 有信任的ip进入了社区黑名单怎么办
|
||||
|
||||
社区黑名单的进入条件是需要多个雷池设备上报恶意行为,自动移出条件是连续一段时间没有被上报
|
||||
|
||||
由于网络环境的复杂性,存在ip被利用或者规则误报导致进入社区黑名单的情况
|
||||
|
||||
出于安全考虑,雷池社区不会主动为任何人移出社区黑名单
|
||||
|
||||
误报如何处理
|
||||
|
||||
1.排查信任ip的情况,确认是否真的安全
|
||||
|
||||
2.对信任的ip针对性配置加白规则
|
||||
|
||||
3.等待信任ip自动被移出社区黑名单
|
||||
|
||||
## 问题无法解决
|
||||
|
||||
1. 通过右上角搜索检索其他页面
|
||||
|
||||
@@ -6,12 +6,32 @@ title: "升级问题"
|
||||
|
||||
记录常见的升级问题
|
||||
|
||||
## 默认账号密码
|
||||
|
||||
雷池社区版5.0.0以后的版本都有一个默认的账户密码
|
||||
|
||||
正常情况升级时shell会自动输出新密码
|
||||
|
||||
若非在线升级,需手动执行重置命令获得密码
|
||||
|
||||
重置密码命令:`docker exec safeline-mgt resetadmin`
|
||||
|
||||
初始密码是随机的,需要修改可以进入【通用配置-其他-雷池控制台登录设置】设置新的密码
|
||||
|
||||
## 升级提示目录不对
|
||||
|
||||
在错误的目录下执行(比如 safeline 的子目录)会导致无法升级成功。
|
||||
|
||||
切换目录到安装目录下再次执行升级,默认目录为:/data/safeline。
|
||||
|
||||
## 配置的备份与恢复(还原)
|
||||
|
||||
升级过程担心配置受到影响
|
||||
|
||||
备份:备份安装目录的全部文件,默认目录为:/data/safeline
|
||||
|
||||
恢复(还原):把备份的内容放回安装目录执行 `docker compose down && docker compose up -d`,重新启动雷池
|
||||
|
||||
## 升级过程中下载超时
|
||||
|
||||
网络问题导致,建议等待网络稳定或者尝试离线升级。
|
||||
|
||||
@@ -143,7 +143,7 @@ docker run -d --restart=always --name safeline-fluentd --net safeline-ce -v ./sq
|
||||
|
||||
## 自定义站点 nginx conf
|
||||
|
||||
雷池每次修改站点或者重启服务时,都会在waf的安装目录下的**resources/nginx/sites-enabled/**重新生成 nginx conf 文件。因为没法“智能”合并用户自定义的配置和自动生成的配置。但是也还是有方式能持久化地添加一些 nginx conf,不会被覆盖。
|
||||
雷池每次修改站点或者重启服务时,都会在waf的安装目录下的 **resources/nginx/sites-enabled/** 重新生成 nginx conf 文件。因为没法“智能”合并用户自定义的配置和自动生成的配置。但是也还是有方式能持久化地添加一些 nginx conf,不会被覆盖。
|
||||
|
||||
每个 `IF_backend_XXX` 的 location 中都有 `include proxy_params;` 这一行配置,且 `resources/nginx/proxy_params` 这个文件不会被修改站点、重启服务等动作覆盖。2.1.0 版本之后支持 `include custom_params/backend_XXX;` 可以自定义站点级的 nginx location 配置。
|
||||
|
||||
|
||||
58
documents/docs/04-practice/04-safeline-cloud.md
Normal file
@@ -0,0 +1,58 @@
|
||||
---
|
||||
title: "雷池云托管"
|
||||
---
|
||||
|
||||
# 雷池云托管
|
||||
|
||||
雷池云托管是长亭融合牧云主机助手的技术,专门为雷池社区用户打造的托管工具,帮你解放双手,像放羊一样管理雷池服务器。
|
||||
|
||||
雷池云托管使用地址:https://rivers.chaitin.cn/?share=85db8d21d63711ee91390242c0a8176b
|
||||
|
||||
主机助手的文档地址:https://rivers.chaitin.cn/docs/zh/cloudwalker
|
||||
|
||||
|
||||
|
||||
## 产品简介
|
||||
|
||||
### 系统信息
|
||||
|
||||
#### 展示当前系统信息
|
||||
|
||||
安装完成后页面会显示当前雷池服务器的基本信息。
|
||||
|
||||
包括雷池社区版的版本、机器码等信息
|
||||
|
||||
#### 快捷升级专业版
|
||||
|
||||
安装云托管的雷池服务器,购买授权后,支持一键升级专业版。
|
||||
|
||||

|
||||
|
||||
|
||||
### 资源监控
|
||||
|
||||
#### 实时监控
|
||||
实时监控CPU,内存,网络,磁盘使用情况,并可以查看7天历史监控。
|
||||
|
||||

|
||||
|
||||
#### 查看历史
|
||||
|
||||
在“资源负载”页面点击“历史”按钮,进入资源占用的历史页面。历史记录可以选择起始日期,起始时间,历史记录时长。
|
||||
|
||||

|
||||
|
||||
### 在线终端
|
||||
|
||||
类似于牧云主机助手,云托管的设备也支持免密登录服务器终端。
|
||||
|
||||
### 使用在线终端
|
||||
|
||||
在“详情”页面点击“在线终端”图标按钮,进入终端界面。
|
||||
|
||||

|
||||
|
||||

|
||||
### 其他
|
||||
|
||||
未来雷池云托管将会增加更多功能,敬请期待
|
||||
1113
documents/docs/05-submission/01-K3s.md
Normal file
7
documents/docs/05-submission/_category_.json
Normal file
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"label": "社区投稿",
|
||||
"collapsed": false,
|
||||
"link": {
|
||||
"type": "generated-index"
|
||||
}
|
||||
}
|
||||
BIN
documents/docs/05-submission/k3s01.jpg
Normal file
|
After Width: | Height: | Size: 89 KiB |
@@ -6,16 +6,165 @@ title: "版本更新记录"
|
||||
|
||||
[版本升级方法](/guide/upgrade)
|
||||
|
||||
### [5.5.0] - 2024-05-09
|
||||
|
||||
#### 新增
|
||||
* 站点列表支持一键配置高级防护规则
|
||||
|
||||

|
||||
|
||||
#### 优化
|
||||
* 黑白名单、人机验证、身份认证 页面合并为 “自定义规则”,简化导航
|
||||
* 黑白名单、身份认证 规则增加 “触发次数” “通过次数” 统计
|
||||
|
||||

|
||||
* 注:同一种规则类型内,触发的优先级为 新添加的自定义规则 > 旧添加的自定义规则 > 站点列表上一键配置的高级防护规则
|
||||
* 站点资源统计逻辑优化
|
||||
* 修复有时候免费证书临期不会自动续期的问题
|
||||
* 修复匹配条件中 ipv6 地址展示不正确的问题([#830](https://github.com/chaitin/SafeLine/issues/830))
|
||||
* 优化一些 UI 交互细节
|
||||
|
||||
### [5.4.0] - 2024-04-25
|
||||
|
||||
#### 新增
|
||||
* 源 IP 获取方式增加 XFF
|
||||
|
||||

|
||||
* 专业版增加 系统设置->检测引擎性能配置,可以根据设备的配置等级选择不同的性能模式
|
||||
|
||||

|
||||
|
||||
#### 优化
|
||||
* 修复浏览器内核版本 < Chromium 93 时,点击智能 AI 分析页面会崩溃的问题
|
||||
* 修复少数情况下,限频没有正常封禁 IP 的问题
|
||||
* 优化 luigi 统计算法,解决 CPU 占用过高的问题
|
||||
* 优化一些 UI 交互细节
|
||||
|
||||
### [5.3.3] - 2024-04-18
|
||||
|
||||
#### 优化
|
||||
* 日志列表不返回 IP 组全部内容,降低访问耗时
|
||||
* 修复基础统计 -> 4xx 数量中,把人机验证拦截也计入了的问题
|
||||
* 修复高级统计 -> 来源域名、来源页面中,把内部跳转也计入了的问题
|
||||
* 修复上游有多个域名时,获取不到正确 title 和 icon 的问题([#821](https://github.com/chaitin/SafeLine/issues/821))
|
||||
* 修复筛选 UI 错位问题([#789](https://github.com/chaitin/SafeLine/issues/789))
|
||||
* 修复其他一些已知问题
|
||||
|
||||
### [5.3.2] - 2024-04-12
|
||||
|
||||
#### 修复
|
||||
* 修复了地理位置库识别错误的问题
|
||||
|
||||
#### 优化
|
||||
* 优化了一些 UI 交互细节
|
||||
|
||||
### [5.3.1] - 2024-04-11
|
||||
|
||||
#### 新增
|
||||
* 专业版支持*钉钉告警*
|
||||
* 专业版新增高级数据统计
|
||||
|
||||
#### 优化
|
||||
* 上线新版智能 AI 攻击分析,分析结果由长亭问津安全大模型提供,大幅度提升安全分析效果
|
||||
* 支持全种类的攻击分析,包含 注入、CSRF、SSRF、后门等
|
||||
* 标准化输出内容,例如 攻击影响、意图分析、防护建议等
|
||||

|
||||
* 优化站点上游服务器的格式校验([#792](https://github.com/chaitin/SafeLine/issues/792) 中涉及问题)
|
||||
* 修复了其他一些已知问题
|
||||
* 优化了一些 UI 交互细节
|
||||
|
||||
### [5.2.0] - 2024-03-28
|
||||
|
||||
#### 新增
|
||||
|
||||
* 黑白名单、人机验证、身份认证中,规则匹配条件增加 “Method”(请求方法),方便对 POST、PUT、DELETE 等客户端操作进行限制
|
||||
* 攻击原始日志的防护模块为 “补充规则” 时,“命中规则” 处增加规则的 ID
|
||||
|
||||
#### 优化
|
||||
|
||||
* 优化导航,调整功能位置,方便寻找:
|
||||
* 证书管理 移动到 防护站点->证书管理
|
||||
* IP 组 移动到 防护配置->通用配置->IP 组
|
||||
* 源 IP 获取方式、站点通用配置 移动到 防护站点->代理设置
|
||||
* 拦截页面附加说明、自定义拦截页面、IP 情报共享计划 移动到 防护配置->通用配置->拦截页面、IP 情报共享计划
|
||||
* 雷池控制台登录设置、雷池控制台证书、Syslog 设置、系统信息 移动到一级导航 系统设置
|
||||
* 密码登录框增加请求频率限制,提高暴力猜解的难度
|
||||
* 免费证书由过期前 10 天自动续期,改为过期前 30 天就自动续期
|
||||
* 修复站点数量较多时,站点管理处采集不到资源的问题
|
||||
* 修复移动端点击登录页的 “忘记密码” 无法弹出重置命令的问题
|
||||
* 修复 syslog 因请求内容较多被截断时,json 格式会被截得不合法的问题
|
||||
* 修复其他一些已知问题
|
||||
* 优化一些 UI 交互细节
|
||||
|
||||
### [5.1.0] - 2024-03-21
|
||||
|
||||
#### 新增
|
||||
|
||||
- 专业版支持 syslog 转发攻击日志到外部服务器。
|
||||
|
||||
#### 修复
|
||||
|
||||
- 修复某些情况下站点资源批量删除失败的问题。
|
||||
- 修复身份认证中配置 ip 组规则时功能异常的问题。
|
||||
- 修复某些攻击日志不显示地址位置的问题。
|
||||
- 修复页面缓存导致显示错误的问题。
|
||||
- 修复其他一些已知问题。
|
||||
|
||||
### [5.0.0] - 2024-03-14
|
||||
|
||||
#### 新增
|
||||
|
||||
- 社区版支持密码登录。系统登录方式改为 密码+可选开启二步验证:
|
||||

|
||||
|
||||
- 专业版
|
||||
- 支持添加多个用户
|
||||
- 支持导出攻击日志为 .csv 文件
|
||||
- 站点的负载均衡支持 IP Hash 算法、最小连接数算法
|
||||
|
||||
#### 修复
|
||||
|
||||
- 修复 luigi 容器有时负载过高降不下来的问题
|
||||
- 修复其他一些已知问题
|
||||
|
||||
### [4.4.2] - 2024-03-09
|
||||
|
||||
#### 修复
|
||||
|
||||
- 修复 FVM 服务在某些情况下 TCP 连接异常升高的问题
|
||||
|
||||
### [4.4.1] - 2024-03-07
|
||||
|
||||
#### 优化
|
||||
|
||||
- 专业版支持在明亮主题和黑金主题之间切换
|
||||
- 优化人机验证([#693](https://github.com/chaitin/SafeLine/issues/693),云端更新,历史版本也生效)
|
||||
- 降低旋转图片的误差要求
|
||||
- 图片不容易对齐时,支持刷新图片
|
||||
- 修复一些低版本浏览器转不动图片的问题
|
||||
- 删除某些特别难对齐的图片
|
||||
- 优化一些界面 UI 和交互细节
|
||||
|
||||
#### 修复
|
||||
|
||||
- 修复防护配置某些极端情况下会失效的问题
|
||||
- 修复向 luigi 发大量日志后,CPU 占用畸高不下的问题
|
||||
- 修复升级或重启后限频可能失效,直到修改任意防护配置的问题
|
||||
- 修复站点选择证书后再直接关闭 SSL,证书管理处 “使用站点”
|
||||
仍然显示该站点的问题([#656](https://github.com/chaitin/SafeLine/issues/656))
|
||||
- 修复攻击事件页面中,允许把 IP 加入至内置 IP 组的问题
|
||||
- 修复其他一些已知问题
|
||||
|
||||
### [4.4.0] - 2024-02-29
|
||||
|
||||
#### 新增
|
||||
|
||||
- 支持升级至专业版,包含内容:
|
||||
- 自定义拦截页面
|
||||
- 商用地理位置库
|
||||
- 额外补充规则
|
||||
- 节点负载均衡
|
||||
- 专属黑金主题
|
||||
- 自定义拦截页面
|
||||
- 商用地理位置库
|
||||
- 额外补充规则
|
||||
- 节点负载均衡
|
||||
- 专属黑金主题
|
||||
|
||||
#### 优化
|
||||
|
||||
@@ -25,7 +174,8 @@ title: "版本更新记录"
|
||||
|
||||
#### 优化
|
||||
|
||||
- 人机验证拦截页面,增加 Content-Security-Policy 策略配置,加强安全性 ([#685](https://github.com/chaitin/SafeLine/issues/685))
|
||||
- 人机验证拦截页面,增加 Content-Security-Policy
|
||||
策略配置,加强安全性 ([#685](https://github.com/chaitin/SafeLine/issues/685))
|
||||
|
||||
#### 修复
|
||||
|
||||
@@ -46,7 +196,8 @@ title: "版本更新记录"
|
||||
#### 修复
|
||||
|
||||
- 修复日志详情中,“补充规则” 的防护模块名字未正确显示的问题
|
||||
- 修复有时候添加 http 站点后,站点会错误地显示到 证书管理->使用站点 处的问题([#656](https://github.com/chaitin/SafeLine/issues/656))
|
||||
- 修复有时候添加 http 站点后,站点会错误地显示到 证书管理->使用站点
|
||||
处的问题([#656](https://github.com/chaitin/SafeLine/issues/656))
|
||||
|
||||
### [4.3.0] - 2024-02-02
|
||||
|
||||
@@ -75,13 +226,14 @@ title: "版本更新记录"
|
||||
- 新增补充规则,可以一览系统当前的通用漏洞规则:
|
||||

|
||||
- 黑白名单、人机验证新增匹配方式,包括:
|
||||
- IP 不等于
|
||||
- Host 不等于
|
||||
- Header 某个参数的内容不等于、包含、不包含
|
||||
- IP 不等于
|
||||
- Host 不等于
|
||||
- Header 某个参数的内容不等于、包含、不包含
|
||||
|
||||
#### 优化
|
||||
|
||||
- 代理时开启 SNI,避免访问上游服务时无法获取正确的证书 ([#491](https://github.com/chaitin/SafeLine/issues/491)、[#609](https://github.com/chaitin/SafeLine/issues/609))
|
||||
- 代理时开启
|
||||
SNI,避免访问上游服务时无法获取正确的证书 ([#491](https://github.com/chaitin/SafeLine/issues/491)、[#609](https://github.com/chaitin/SafeLine/issues/609))
|
||||
- 当尝试在同一端口同时监听 http 和 https 时,给出更具体的错误提示
|
||||
- 优化英文英文模式下中国省份的显示([#512](https://github.com/chaitin/SafeLine/issues/512))
|
||||
- 优化英文模式下攻击事件页 tab 按钮的对齐([#604](https://github.com/chaitin/SafeLine/issues/604))
|
||||
@@ -137,14 +289,16 @@ title: "版本更新记录"
|
||||
- 完整支持 **流式语义分析检测**,包含 协议解析、解码、模式匹配 三个阶段的改造,解决经典 “大包绕过” 问题
|
||||
- IP 组支持通过 URL 在线订阅内容([#414](https://github.com/chaitin/SafeLine/issues/414)):
|
||||

|
||||
- 新增 “搜索引擎爬虫 IP”,包含 Google、Bing、百度、360 的爬虫 IP([#374](https://github.com/chaitin/SafeLine/issues/374)、[#399](https://github.com/chaitin/SafeLine/issues/399)):
|
||||
- 新增 “搜索引擎爬虫 IP”,包含 Google、Bing、百度、360 的爬虫
|
||||
IP([#374](https://github.com/chaitin/SafeLine/issues/374)、[#399](https://github.com/chaitin/SafeLine/issues/399)):
|
||||

|
||||
- 出厂预置 “搜索引擎爬虫白名单” 和 “长亭社区恶意 IP 情报黑名单”,方便配置
|
||||
|
||||
#### 优化
|
||||
|
||||
- 支持类 ChatGPT 应用的流式 HTTP 响应([#513](https://github.com/chaitin/SafeLine/issues/513))
|
||||
- 在 证书管理 编辑证书后,若证书正被站点使用,自动重启 nginx 使新证书生效([#534](https://github.com/chaitin/SafeLine/issues/534))
|
||||
- 在 证书管理 编辑证书后,若证书正被站点使用,自动重启 nginx
|
||||
使新证书生效([#534](https://github.com/chaitin/SafeLine/issues/534))
|
||||
- safeline-fvm 容器体积减小 60%
|
||||
- safeline-mgt 服务减少宿主机文件依赖
|
||||
- safeline-mgt 服务日志全部写入 docker 标准输出,默认仅输出启动信息和错误日志,减小磁盘占用
|
||||
@@ -153,13 +307,13 @@ title: "版本更新记录"
|
||||
- 增加新统计服务 safeline-luigi,为更精细的统计能力做准备
|
||||
- 优化若干 UI 交互、文字描述、英文翻译的细节(感谢国际友人的帮助)
|
||||
- 修复 3.16 以及之前版本的一些问题:
|
||||
- safeline-tcd 启动时因启动顺序导致输出错误提示
|
||||
- http 强制跳转到 https 功能未生效
|
||||
- safeline-tcd 启动时因启动顺序导致输出错误提示
|
||||
- http 强制跳转到 https 功能未生效
|
||||
- 修复 4.0.0-beta.x 版本中的一些问题:
|
||||
- 登录雷池失败,提示 HTTP/2 协议错误([#564](https://github.com/chaitin/SafeLine/issues/564))
|
||||
- 升级脚本未正常检测到雷池安装目录([#561](https://github.com/chaitin/SafeLine/pull/561),感谢热心网友 nmgliangwei)
|
||||
- safeline-mgt 持续输出版本号错误日志
|
||||
- 拦截页面未显示时间
|
||||
- 登录雷池失败,提示 HTTP/2 协议错误([#564](https://github.com/chaitin/SafeLine/issues/564))
|
||||
- 升级脚本未正常检测到雷池安装目录([#561](https://github.com/chaitin/SafeLine/pull/561),感谢热心网友 nmgliangwei)
|
||||
- safeline-mgt 持续输出版本号错误日志
|
||||
- 拦截页面未显示时间
|
||||
|
||||
### [4.0.0-beta.3] - 2023-12-28
|
||||
|
||||
@@ -283,7 +437,8 @@ title: "版本更新记录"
|
||||
|
||||
#### 修复
|
||||
|
||||
- 修复重启 docker (包括雷池升级)后,站点通用配置和拦截页面附加说明没有被正确载入的问题 ([#438](https://github.com/chaitin/SafeLine/issues/438) [#446](https://github.com/chaitin/SafeLine/issues/446))
|
||||
- 修复重启 docker
|
||||
(包括雷池升级)后,站点通用配置和拦截页面附加说明没有被正确载入的问题 ([#438](https://github.com/chaitin/SafeLine/issues/438) [#446](https://github.com/chaitin/SafeLine/issues/446))
|
||||
|
||||
### [3.12.1] - 2023-11-16
|
||||
|
||||
@@ -294,8 +449,10 @@ title: "版本更新记录"
|
||||
|
||||
#### 优化
|
||||
|
||||
- 修复证书在添加一段时间后,证书类型统一变成 “上传已有证书” ,编辑时也看不到证书内容的问题。(免费证书需要手动再切换到免费证书申请一下,后续才能自动续期。只影响列表管理,不影响网站上的证书)
|
||||
- 开启 “强制 HTTPS” 时,HSTS 删去 preload 参数,并改为只在 https 端口下返回 ([#407](https://github.com/chaitin/SafeLine/issues/407))
|
||||
- 修复证书在添加一段时间后,证书类型统一变成 “上传已有证书”
|
||||
,编辑时也看不到证书内容的问题。(免费证书需要手动再切换到免费证书申请一下,后续才能自动续期。只影响列表管理,不影响网站上的证书)
|
||||
- 开启 “强制 HTTPS” 时,HSTS 删去 preload 参数,并改为只在 https
|
||||
端口下返回 ([#407](https://github.com/chaitin/SafeLine/issues/407))
|
||||
- 修复添加、编辑站点有时出现 “Service abnormal” 异常的问题
|
||||
- 修复 “申请免费证书” 类型的证书,在证书列表上显示成 “上传已有证书” 的问题
|
||||
- 优化一些样式交互细节
|
||||
@@ -345,13 +502,15 @@ title: "版本更新记录"
|
||||
- 人机验证的客户端文件从 138k 减小到 78k,提高加载速度
|
||||
- 人机验证 cookie 改为 httpOnly 模式,避免在 JavaScript 运行时泄露
|
||||
- 人机验证防止简单绕过 ([#405](https://github.com/chaitin/SafeLine/issues/405))
|
||||
- 修复站点详情中,资源 “今日请求” 的总和大于站点 “今日请求总量” 的问题([#410](https://github.com/chaitin/SafeLine/issues/410))
|
||||
- 修复站点详情中,资源 “今日请求” 的总和大于站点 “今日请求总量”
|
||||
的问题([#410](https://github.com/chaitin/SafeLine/issues/410))
|
||||
|
||||
### [3.9.0] - 2023-10-26
|
||||
|
||||
#### 优化
|
||||
|
||||
- 人机验证页面增加响应头 Cache-Control,向下游声明不希望被缓存,避免被 CDN 缓存导致不断重复验证([#402](https://github.com/chaitin/SafeLine/issues/402) )
|
||||
- 人机验证页面增加响应头 Cache-Control,向下游声明不希望被缓存,避免被 CDN
|
||||
缓存导致不断重复验证([#402](https://github.com/chaitin/SafeLine/issues/402) )
|
||||
- 修复人机验证在 iframe 中会不断重复验证的问题([#397](https://github.com/chaitin/SafeLine/issues/397) )
|
||||
- 修复人机验证在 alook 浏览器中页面空白的问题([#393](https://github.com/chaitin/SafeLine/issues/393) )
|
||||
- 修复添加、编辑站点有时出现 “Service abnormal” 异常的问题
|
||||
@@ -399,9 +558,9 @@ title: "版本更新记录"
|
||||
#### 优化
|
||||
|
||||
- 优化人机验证
|
||||
- 简化配置,不再区分交互、非交互
|
||||
- 区分站点,验证通过的结果只能在一个站点(按域名或 IP 区分)上生效了
|
||||
- 降低算力要求,解决部分移动端验证时间过长的问题
|
||||
- 简化配置,不再区分交互、非交互
|
||||
- 区分站点,验证通过的结果只能在一个站点(按域名或 IP 区分)上生效了
|
||||
- 降低算力要求,解决部分移动端验证时间过长的问题
|
||||
- 配置站点时,“上游服务器” 的服务器地址部分支持填写主机名,例如 http://localhost:8080
|
||||
- 站点的运行模式为 “观察” 时,黑名单、限频、人机 改为**都不拦截**。其中黑名单会记录 “放行” 的日志;限频会持续计入统计,但限制结果不会对观察中的站点生效
|
||||
- 修复证书管理中,泛域名的证书显示 “域名不匹配” 问题([#368](https://github.com/chaitin/SafeLine/issues/368))
|
||||
@@ -498,7 +657,8 @@ title: "版本更新记录"
|
||||
|
||||
- 当网站域名不匹配的时候,返回 “网站不存在” ,提示更清晰([#58](https://github.com/chaitin/SafeLine/issues/58))
|
||||
- 修复 攻击事件->原始日志 的 “攻击地址” 中显示额外的转义符的问题
|
||||
- 修复站点详情中 “今日总请求量” 和站点列表的 “今日访问量” 不一致的问题([#279](https://github.com/chaitin/SafeLine/issues/279))
|
||||
- 修复站点详情中 “今日总请求量” 和站点列表的 “今日访问量”
|
||||
不一致的问题([#279](https://github.com/chaitin/SafeLine/issues/279))
|
||||
- 频率限制后直接封禁的拦截状态码改为 429,和普通拦截 403 区分开,方便排查拦截原因
|
||||
- 加强后台登录安全性(感谢微信交流 20 群「千年之狐」提供的建议)
|
||||
- 优化安装/升级时 CPU ssse3 指令集的检查方式([#273](https://github.com/chaitin/SafeLine/issues/273))
|
||||
@@ -531,7 +691,8 @@ title: "版本更新记录"
|
||||
|
||||
#### 新增
|
||||
|
||||
- 新增证书管理。自动判断域名与过期状态,配置站点时可以直接选择([#111](https://github.com/chaitin/SafeLine/issues/111)),还可以修改管理后台的证书([#201](https://github.com/chaitin/SafeLine/issues/201))
|
||||
- 新增证书管理。自动判断域名与过期状态,配置站点时可以直接选择([#111](https://github.com/chaitin/SafeLine/issues/111)
|
||||
),还可以修改管理后台的证书([#201](https://github.com/chaitin/SafeLine/issues/201))
|
||||

|
||||
- 新增系统信息
|
||||
|
||||
@@ -556,24 +717,26 @@ title: "版本更新记录"
|
||||
#### 新增
|
||||
|
||||
- 新增站点详情,能自动从流量中记录网站资源,一览资源的存活、访问情况
|
||||
- PS. 考虑机器资源消耗问题,当前版本每个站点下最多记录 250 个资源
|
||||
- PS. 考虑机器资源消耗问题,当前版本每个站点下最多记录 250 个资源
|
||||
|
||||

|
||||
|
||||
- 站点支持输入多个域名、端口([#162](https://github.com/chaitin/safeline/issues/162))
|
||||
- 通用配置中新增 “站点通用配置”,支持一键开启:
|
||||
- 强制 HTTPS([#67](https://github.com/chaitin/safeline/issues/67))
|
||||
- 使用 HTTP/2([#161](https://github.com/chaitin/safeline/issues/161))
|
||||
- 监听 IPv6([#166](https://github.com/chaitin/safeline/issues/166))
|
||||
- 传递客户端连接的 Host 和协议,方便后续服务器处理
|
||||
- 强制 HTTPS([#67](https://github.com/chaitin/safeline/issues/67))
|
||||
- 使用 HTTP/2([#161](https://github.com/chaitin/safeline/issues/161))
|
||||
- 监听 IPv6([#166](https://github.com/chaitin/safeline/issues/166))
|
||||
- 传递客户端连接的 Host 和协议,方便后续服务器处理
|
||||
|
||||

|
||||
|
||||
#### 优化
|
||||
|
||||
- 优化限频配置的默认值
|
||||
- 增加 HTTP 497 错误重定向。当以 HTTP 协议访问 HTTPS 端口时,将重定向到 HTTPS([#186](https://github.com/chaitin/safeline/issues/186))
|
||||
- 默认拒绝 IP 和其他非指定域名的访问。如果需要通过 IP 访问站点,可以给站点添加一个 "\*" 域名([#58](https://github.com/chaitin/safeline/issues/58))
|
||||
- 增加 HTTP 497 错误重定向。当以 HTTP 协议访问 HTTPS 端口时,将重定向到
|
||||
HTTPS([#186](https://github.com/chaitin/safeline/issues/186))
|
||||
- 默认拒绝 IP 和其他非指定域名的访问。如果需要通过 IP 访问站点,可以给站点添加一个 "\*"
|
||||
域名([#58](https://github.com/chaitin/safeline/issues/58))
|
||||
- 优化若干 UI 交互细节和文字提示
|
||||
|
||||
### [2.6.0] - 2023-08-10
|
||||
@@ -740,9 +903,9 @@ title: "版本更新记录"
|
||||
|
||||
- 更新语义引擎版本,优化了一大批检测逻辑,降低误报
|
||||
- 优化了部分操作提示信息:
|
||||
- IP 组正在使用时,无法被删除的提示
|
||||
- 未创建 IP 组时,在黑白名单中无法选择属于 IP 组的提示
|
||||
- 添加站点时,域名格式错误的提示
|
||||
- IP 组正在使用时,无法被删除的提示
|
||||
- 未创建 IP 组时,在黑白名单中无法选择属于 IP 组的提示
|
||||
- 添加站点时,域名格式错误的提示
|
||||
|
||||
### [1.7.1] - 2023-06-05
|
||||
|
||||
@@ -15,15 +15,14 @@ title: "人机验证2.0"
|
||||
### 人机验证如何配置
|
||||
|
||||
首先,点击位于左边栏的人机验证。之后,点击 **添加人机验证**。
|
||||
|
||||
|
||||

|
||||
在这里我们可以配置是否开启交互式校验以及规则的名称以及规则的触发条件。
|
||||
|
||||
在这里我们可以配置规则的名称以及规则的触发条件。
|
||||
|
||||
### 人机验证触发规则
|
||||
|
||||
1. 规则内的条件之间是并且的关系,即需要全部命中,才会触发
|
||||
2. 规则与规则之间是或的关系,则有一个命中,便会触发
|
||||
|
||||
### 交互与非交互的区别
|
||||
|
||||
如果选择开启交互,那么用户需要点击页面中间的勾选框开始验证,如果选择非交互,那么将自动开始验证。
|
||||

|
||||
@@ -4,7 +4,7 @@ title: "雷池技术架构"
|
||||
|
||||
# 雷池技术架构
|
||||
|
||||
查看雷池的服务架构图。最上面虚线框住的是数据流,也就是访问业务服务器的流量数据的流动情况。中间框起来的部分是雷池的各个服务。
|
||||
查看雷池的服务架构图(示意图较老,参考为主)。最上面虚线框住的是数据流,也就是访问业务服务器的流量数据的流动情况。中间框起来的部分是雷池的各个服务。
|
||||
|
||||

|
||||
|
||||
@@ -12,11 +12,14 @@ title: "雷池技术架构"
|
||||
|
||||
| 名称 | 定义 | 详情 |
|
||||
| ----------------- | ------------ | ------------------------------------------------------- |
|
||||
| safeline-mgt | 管理容器 | 接收管理后台行为,向其他服务或容器推送消息 |
|
||||
| safeline-mgt | 管理容器(管理端) | 接收管理后台行为,向其他服务或容器推送消息 |
|
||||
| safeline-detector | 检测容器 | 执行检测的容器,从 Tengine 进入的流量会转发到该节点检测 |
|
||||
| safeline-mario | 日志容器 | 记录与统计恶意行为的节点 |
|
||||
| safeline-tengine | 网关 | 转发网关,有简单的过滤功能 |
|
||||
| safeline-tengine | 网关 | 转发网关,有简单的过滤功能,基于nginx实现 |
|
||||
| safeline-pg | 关系型数据库 | 存储攻击日志、保护站点、黑白名单配置的数据库 |
|
||||
| safeline-luigi | 数据统计服务 | 统计qps等信息 |
|
||||
| safeline-fvm | 规则处理容器 | 将规则传递到检测容器 |
|
||||
| safeline-bridge | 支持云托管 | 通讯的桥接器 |
|
||||
|
||||
对于后台管理人员,可以直接通信的节点为管理服务 `safeline-mgt`,该节点负责:
|
||||
|
||||
BIN
documents/static/images/docs/about_changelog/5.0.0-1.png
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
documents/static/images/docs/about_changelog/5.3.1-1.png
Normal file
|
After Width: | Height: | Size: 133 KiB |
BIN
documents/static/images/docs/about_changelog/5.4.0-1.png
Normal file
|
After Width: | Height: | Size: 35 KiB |
BIN
documents/static/images/docs/about_changelog/5.4.0-2.png
Normal file
|
After Width: | Height: | Size: 31 KiB |
BIN
documents/static/images/docs/about_changelog/5.5.0-1.png
Normal file
|
After Width: | Height: | Size: 41 KiB |
BIN
documents/static/images/docs/about_changelog/5.5.0-2.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 270 KiB After Width: | Height: | Size: 275 KiB |
BIN
documents/static/images/docs/guide_config/config_site4.png
Normal file
|
After Width: | Height: | Size: 100 KiB |
BIN
documents/static/images/docs/guide_config/login_1.png
Normal file
|
After Width: | Height: | Size: 26 KiB |
BIN
documents/static/images/docs/guide_config/login_2.png
Normal file
|
After Width: | Height: | Size: 80 KiB |
|
Before Width: | Height: | Size: 80 KiB After Width: | Height: | Size: 64 KiB |
BIN
documents/static/images/docs/guide_config/other_config3.png
Normal file
|
After Width: | Height: | Size: 105 KiB |
BIN
documents/static/images/docs/guide_config/other_config4.png
Normal file
|
After Width: | Height: | Size: 23 KiB |
BIN
documents/static/images/docs/guide_config/other_config5.png
Normal file
|
After Width: | Height: | Size: 79 KiB |
BIN
documents/static/images/docs/guide_config/other_config6.png
Normal file
|
After Width: | Height: | Size: 48 KiB |
BIN
documents/static/images/docs/guide_config/other_config7.png
Normal file
|
After Width: | Height: | Size: 43 KiB |
|
After Width: | Height: | Size: 54 KiB |
|
After Width: | Height: | Size: 50 KiB |
|
After Width: | Height: | Size: 147 KiB |
|
After Width: | Height: | Size: 439 KiB |
|
After Width: | Height: | Size: 261 KiB |
@@ -2001,10 +2001,10 @@
|
||||
prop-types "^15.8.1"
|
||||
react-is "^18.2.0"
|
||||
|
||||
"@node-rs/jieba-darwin-x64@1.7.2":
|
||||
"@node-rs/jieba-darwin-arm64@1.7.2":
|
||||
version "1.7.2"
|
||||
resolved "https://registry.npmmirror.com/@node-rs/jieba-darwin-x64/-/jieba-darwin-x64-1.7.2.tgz"
|
||||
integrity sha512-euDawBU2FxB0CGTR803BA6WABsiicIrqa61z2AFFDPkJCDrauEM0jbMg3GDKLAvbaLbZ1Etu3QNN5xyroqp4Qw==
|
||||
resolved "https://registry.npmmirror.com/@node-rs/jieba-darwin-arm64/-/jieba-darwin-arm64-1.7.2.tgz"
|
||||
integrity sha512-M2cHIWRaaOmXGKy446SH2+Y2PzREaI2oYznPbg55wYEdioUp01YS/2WRG8CaoCKEj0aUocA7MFM2vVcoIAsbQw==
|
||||
|
||||
"@node-rs/jieba@^1.6.0":
|
||||
version "1.7.2"
|
||||
|
||||
@@ -201,3 +201,10 @@
|
||||
66.249.79.32/27
|
||||
66.249.79.64/27
|
||||
66.249.79.96/27
|
||||
|
||||
# river
|
||||
39.105.229.198
|
||||
101.37.81.162
|
||||
47.106.222.10
|
||||
8.137.22.18
|
||||
8.222.172.192
|
||||
@@ -24,7 +24,9 @@ services:
|
||||
networks:
|
||||
safeline-ce:
|
||||
ipv4_address: ${SUBNET_PREFIX}.2
|
||||
command: [postgres, -c, max_connections=200]
|
||||
command: [postgres, -c, max_connections=600]
|
||||
healthcheck:
|
||||
test: pg_isready -U safeline-ce -d safeline-ce
|
||||
mgt:
|
||||
container_name: safeline-mgt
|
||||
restart: always
|
||||
@@ -34,6 +36,8 @@ services:
|
||||
- ${SAFELINE_DIR}/resources/mgt:/app/data
|
||||
ports:
|
||||
- ${MGT_PORT:-9443}:1443
|
||||
healthcheck:
|
||||
test: curl -k -f https://localhost:1443/api/open/health
|
||||
environment:
|
||||
- MGT_PG=postgres://safeline-ce:${POSTGRES_PASSWORD}@safeline-pg/safeline-ce?sslmode=disable
|
||||
depends_on:
|
||||
@@ -78,6 +82,10 @@ services:
|
||||
- LOG_DIR=/logs/mario
|
||||
- GOGC=100
|
||||
- DATABASE_URL=postgres://safeline-ce:${POSTGRES_PASSWORD}@safeline-pg/safeline-ce
|
||||
logging:
|
||||
options:
|
||||
max-size: "100m"
|
||||
max-file: "10"
|
||||
networks:
|
||||
safeline-ce:
|
||||
ipv4_address: ${SUBNET_PREFIX}.6
|
||||
@@ -109,6 +117,10 @@ services:
|
||||
volumes:
|
||||
- /etc/localtime:/etc/localtime:ro
|
||||
- ${SAFELINE_DIR}/resources/luigi:/app/data
|
||||
logging:
|
||||
options:
|
||||
max-size: "100m"
|
||||
max-file: "10"
|
||||
depends_on:
|
||||
- detect
|
||||
- mgt
|
||||
@@ -121,6 +133,10 @@ services:
|
||||
image: ${IMAGE_PREFIX}/safeline-fvm:${IMAGE_TAG}
|
||||
volumes:
|
||||
- /etc/localtime:/etc/localtime:ro
|
||||
logging:
|
||||
options:
|
||||
max-size: "100m"
|
||||
max-file: "10"
|
||||
networks:
|
||||
safeline-ce:
|
||||
ipv4_address: ${SUBNET_PREFIX}.8
|
||||
|
||||
@@ -9,7 +9,7 @@ echo "
|
||||
"
|
||||
|
||||
export STREAM=${STREAM:-0}
|
||||
export CDN=${CDN:-0}
|
||||
export CDN=${CDN:-1}
|
||||
|
||||
qrcode() {
|
||||
echo "█████████████████████████████████████████"
|
||||
@@ -42,6 +42,23 @@ command_exists() {
|
||||
command -v "$1" 2>&1
|
||||
}
|
||||
|
||||
check_container_health() {
|
||||
local container_name=$1
|
||||
local max_retry=30
|
||||
local retry=0
|
||||
local health_status="unhealthy"
|
||||
echo "Waiting for $container_name to be healthy"
|
||||
while [[ "$health_status" == "unhealthy" && $retry -lt $max_retry ]]; do
|
||||
health_status=$(docker inspect --format='{{.State.Health.Status}}' $container_name 2>/dev/null || echo 'unhealthy')
|
||||
sleep 1
|
||||
retry=$((retry+1))
|
||||
done
|
||||
if [[ "$health_status" == "unhealthy" ]]; then
|
||||
abort "Container $container_name is unhealthy"
|
||||
fi
|
||||
echo "Container $container_name is healthy"
|
||||
}
|
||||
|
||||
space_left() {
|
||||
dir="$1"
|
||||
while [ ! -d "$dir" ]; do
|
||||
@@ -233,6 +250,10 @@ fi
|
||||
|
||||
qrcode
|
||||
|
||||
check_container_health safeline-pg
|
||||
check_container_health safeline-mgt
|
||||
docker exec safeline-mgt /app/mgt-cli reset-admin --once
|
||||
|
||||
warning "雷池 WAF 社区版安装成功,请访问以下地址访问控制台"
|
||||
warning "https://0.0.0.0:9443/"
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@ echo "
|
||||
"
|
||||
|
||||
export STREAM=${STREAM:-0}
|
||||
export CDN=${CDN:-0}
|
||||
export CDN=${CDN:-1}
|
||||
|
||||
echo $1
|
||||
|
||||
@@ -46,6 +46,23 @@ command_exists() {
|
||||
command -v "$1" 2>&1
|
||||
}
|
||||
|
||||
check_container_health() {
|
||||
local container_name=$1
|
||||
local max_retry=30
|
||||
local retry=0
|
||||
local health_status="unhealthy"
|
||||
echo "Waiting for $container_name to be healthy"
|
||||
while [[ "$health_status" == "unhealthy" && $retry -lt $max_retry ]]; do
|
||||
health_status=$(docker inspect --format='{{.State.Health.Status}}' $container_name 2>/dev/null || echo 'unhealthy')
|
||||
sleep 1
|
||||
retry=$((retry+1))
|
||||
done
|
||||
if [[ "$health_status" == "unhealthy" ]]; then
|
||||
abort "Container $container_name is unhealthy"
|
||||
fi
|
||||
echo "Container $container_name is healthy"
|
||||
}
|
||||
|
||||
space_left() {
|
||||
dir="$1"
|
||||
while [ ! -d "$dir" ]; do
|
||||
@@ -251,9 +268,14 @@ $compose_command down --remove-orphans && $compose_command up -d
|
||||
if [ $? -ne "0" ]; then
|
||||
abort "替换 Docker 容器失败"
|
||||
fi
|
||||
info "雷池升级成功"
|
||||
|
||||
qrcode
|
||||
|
||||
check_container_health safeline-pg
|
||||
check_container_health safeline-mgt
|
||||
docker exec safeline-mgt /app/mgt-cli reset-admin --once
|
||||
|
||||
info "雷池升级成功"
|
||||
|
||||
warning "雷池 WAF 社区版安装成功, 请访问以下地址访问控制台"
|
||||
warning "https://0.0.0.0:9443/"
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
{
|
||||
"latest_version": "v4.4.0",
|
||||
"rec_version": "v3.16.1"
|
||||
"latest_version": "v5.5.0",
|
||||
"rec_version": "v5.5.0"
|
||||
}
|
||||
8
website/package-lock.json
generated
@@ -28,7 +28,7 @@
|
||||
"eslint-config-next": "14.0.1",
|
||||
"postcss": "^8",
|
||||
"tailwindcss": "^3.3.0",
|
||||
"typescript": "^5"
|
||||
"typescript": "5.4.2"
|
||||
}
|
||||
},
|
||||
"node_modules/@aashutoshrathi/word-wrap": {
|
||||
@@ -4535,9 +4535,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/typescript": {
|
||||
"version": "5.2.2",
|
||||
"resolved": "https://registry.npmmirror.com/typescript/-/typescript-5.2.2.tgz",
|
||||
"integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==",
|
||||
"version": "5.4.2",
|
||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.2.tgz",
|
||||
"integrity": "sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==",
|
||||
"dev": true,
|
||||
"bin": {
|
||||
"tsc": "bin/tsc",
|
||||
|
||||
@@ -30,6 +30,6 @@
|
||||
"eslint-config-next": "14.0.1",
|
||||
"postcss": "^8",
|
||||
"tailwindcss": "^3.3.0",
|
||||
"typescript": "^5"
|
||||
"typescript": "5.4.2"
|
||||
}
|
||||
}
|
||||
|
||||
BIN
website/public/images/bounty.png
Normal file
|
After Width: | Height: | Size: 745 KiB |
BIN
website/public/images/bounty_btn.png
Normal file
|
After Width: | Height: | Size: 7.4 KiB |
@@ -1,29 +1,43 @@
|
||||
export {
|
||||
getSetupCount,
|
||||
getDiscussions,
|
||||
getIssues,
|
||||
getReposInfo,
|
||||
};
|
||||
|
||||
const BASE_API = "/api";
|
||||
getSetupCount,
|
||||
getDiscussions,
|
||||
getIssues,
|
||||
getReposInfo,
|
||||
detectorPoint,
|
||||
};
|
||||
|
||||
function getAPIUrl() {
|
||||
return (process.env.TARGET || '') + BASE_API;
|
||||
}
|
||||
const BASE_API = "/api";
|
||||
|
||||
function getSetupCount() {
|
||||
return fetch(getAPIUrl() + "/safeline/count").then((res) => res.json());
|
||||
}
|
||||
function getAPIUrl() {
|
||||
return (process.env.TARGET || "") + BASE_API;
|
||||
}
|
||||
|
||||
function getReposInfo() {
|
||||
return fetch(getAPIUrl() + "/repos/info").then((res) => res.json());
|
||||
}
|
||||
function getSetupCount() {
|
||||
return fetch(getAPIUrl() + "/safeline/count").then((res) => res.json());
|
||||
}
|
||||
|
||||
function getDiscussions(query: string) {
|
||||
return fetch(getAPIUrl() + "/repos/discussions?q=" + query).then((res) => res.json());
|
||||
}
|
||||
function getReposInfo() {
|
||||
return fetch(getAPIUrl() + "/repos/info").then((res) => res.json());
|
||||
}
|
||||
|
||||
function getIssues(query: string) {
|
||||
return fetch(getAPIUrl() + "/repos/issues?q=" + query).then((res) => res.json());
|
||||
}
|
||||
|
||||
function getDiscussions(query: string) {
|
||||
return fetch(getAPIUrl() + "/repos/discussions?q=" + query).then((res) =>
|
||||
res.json()
|
||||
);
|
||||
}
|
||||
|
||||
function getIssues(query: string) {
|
||||
return fetch(getAPIUrl() + "/repos/issues?q=" + query).then((res) =>
|
||||
res.json()
|
||||
);
|
||||
}
|
||||
|
||||
// 购买 1001
|
||||
// 咨询 1002
|
||||
function detectorPoint(query: { source?: string; type: 1001 | 1002 }) {
|
||||
const search = new URLSearchParams(location.search);
|
||||
query.source = search.get("source") || document.referrer;
|
||||
return fetch(
|
||||
getAPIUrl() + "/behavior", {method: 'POST', body: JSON.stringify(query)}
|
||||
).then((res) => res.json());
|
||||
}
|
||||
|
||||
@@ -1,10 +1,28 @@
|
||||
import React, { useEffect, useState } from 'react';
|
||||
import { AppBar, Drawer, Grid, Toolbar, Typography, Button, Box, Container, Link, List, ListItem, ListItemText, Stack, IconButton } from '@mui/material';
|
||||
import Image from 'next/image';
|
||||
import dynamic from 'next/dynamic';
|
||||
import React, { useEffect, useState } from "react";
|
||||
import {
|
||||
AppBar,
|
||||
Drawer,
|
||||
Grid,
|
||||
Toolbar,
|
||||
Typography,
|
||||
Button,
|
||||
Box,
|
||||
Container,
|
||||
Link,
|
||||
List,
|
||||
ListItem,
|
||||
ListItemText,
|
||||
Stack,
|
||||
IconButton,
|
||||
} from "@mui/material";
|
||||
import Image from "next/image";
|
||||
import dynamic from "next/dynamic";
|
||||
import Icon from "@/components/Icon";
|
||||
import CloseIcon from '@mui/icons-material/Close';
|
||||
import usePopupState, { bindPopover, bindHover } from '@/components/Popover/usePopupState'
|
||||
import CloseIcon from "@mui/icons-material/Close";
|
||||
import usePopupState, {
|
||||
bindPopover,
|
||||
bindHover,
|
||||
} from "@/components/Popover/usePopupState";
|
||||
|
||||
const navs = [
|
||||
{ to: "/docs", label: "帮助文档", target: "_blank" },
|
||||
@@ -14,61 +32,142 @@ const navs = [
|
||||
|
||||
const menus = [
|
||||
...navs,
|
||||
{ to: "https://github.com/chaitin/SafeLine", label: "GitHub", target: "_blank" },
|
||||
{ to: "https://demo.waf-ce.chaitin.cn:9443/dashboard", label: "演示 Demo", target: "_blank" },
|
||||
{
|
||||
to: "https://github.com/chaitin/SafeLine",
|
||||
label: "GitHub",
|
||||
target: "_blank",
|
||||
},
|
||||
{
|
||||
to: "https://demo.waf-ce.chaitin.cn:9443/dashboard",
|
||||
label: "演示 Demo",
|
||||
target: "_blank",
|
||||
},
|
||||
];
|
||||
|
||||
const HoverPopover = dynamic(() => import('@/components/Popover/HoverPopover'), {
|
||||
ssr: false,
|
||||
});
|
||||
const HoverPopover = dynamic(
|
||||
() => import("@/components/Popover/HoverPopover"),
|
||||
{
|
||||
ssr: false,
|
||||
}
|
||||
);
|
||||
|
||||
export default function NavBar() {
|
||||
const [isSticky, setIsSticky] = useState(false);
|
||||
const [open, setOpen] = useState(false);
|
||||
|
||||
const popoverState = usePopupState({
|
||||
popupId: "wechat-qrcode-popover"
|
||||
})
|
||||
popupId: "wechat-qrcode-popover",
|
||||
});
|
||||
|
||||
const popoverState1 = usePopupState({
|
||||
popupId: "bounty-popover",
|
||||
});
|
||||
|
||||
useEffect(() => {
|
||||
const handleScroll = () => {
|
||||
const scrollTop = window.pageYOffset;
|
||||
setIsSticky(scrollTop > 0);
|
||||
};
|
||||
handleScroll()
|
||||
window.addEventListener('scroll', handleScroll);
|
||||
handleScroll();
|
||||
window.addEventListener("scroll", handleScroll);
|
||||
|
||||
return () => {
|
||||
window.removeEventListener('scroll', handleScroll);
|
||||
window.removeEventListener("scroll", handleScroll);
|
||||
};
|
||||
}, []);
|
||||
|
||||
return (
|
||||
<>
|
||||
<AppBar position='fixed' color='transparent'
|
||||
<AppBar
|
||||
position="fixed"
|
||||
color="transparent"
|
||||
sx={{
|
||||
boxShadow: 'none',
|
||||
...(isSticky ? { backdropFilter: 'blur(8px)', background: 'rgba(255,255,255,0.8)' } : {}),
|
||||
alignItems: 'center'
|
||||
boxShadow: "none",
|
||||
...(isSticky
|
||||
? {
|
||||
backdropFilter: "blur(8px)",
|
||||
background: "rgba(255,255,255,0.8)",
|
||||
}
|
||||
: {}),
|
||||
alignItems: "center",
|
||||
}}
|
||||
>
|
||||
<Container maxWidth="lg" sx={{ mx: 0 }}>
|
||||
<Toolbar sx={{ backgroundColor: 'transparent', py: 1, ml: 2, px: { sm: 0 } }}>
|
||||
<Toolbar
|
||||
sx={{ backgroundColor: "transparent", py: 1, ml: 2, px: { sm: 0 } }}
|
||||
>
|
||||
<Grid container justifyContent="space-around">
|
||||
<Grid item xs={10} md={6} display="flex">
|
||||
<Box display="flex" alignItems="center">
|
||||
<SafelineTitle />
|
||||
<Box display={{ xs: 'none', md: 'flex' }} alignItems="center">
|
||||
<Box display={{ xs: "none", md: "flex" }} alignItems="center">
|
||||
{navs.map((nav, index) => (
|
||||
<Box component="span" key={index} mr={3.5}>
|
||||
<Link key={index} href={nav.to} sx={{ color: "common.black" }} target={nav.target}>{nav.label}</Link>
|
||||
<Link
|
||||
key={index}
|
||||
href={nav.to}
|
||||
sx={{ color: "common.black" }}
|
||||
target={nav.target}
|
||||
>
|
||||
{nav.label}
|
||||
</Link>
|
||||
</Box>
|
||||
))}
|
||||
</Box>
|
||||
</Box>
|
||||
</Grid>
|
||||
<Grid item xs={2} md={6} display="flex" justifyContent="flex-end">
|
||||
<Box sx={{ fontSize: "16px", display: { xs: "none", md: "flex" }, alignItems: "center" }}>
|
||||
<Box
|
||||
sx={{
|
||||
fontSize: "16px",
|
||||
display: { xs: "none", md: "flex" },
|
||||
alignItems: "center",
|
||||
}}
|
||||
>
|
||||
<Box mr={3.5}>
|
||||
<Typography
|
||||
{...bindHover(popoverState1 as any)}
|
||||
variant="body1"
|
||||
sx={{
|
||||
color: popoverState1.isOpen
|
||||
? "primary.main"
|
||||
: "common.black",
|
||||
cursor: "pointer",
|
||||
"&:hover": {
|
||||
color: "primary.main",
|
||||
backgroundColor: "transparent",
|
||||
},
|
||||
transition: "unset",
|
||||
}}
|
||||
>
|
||||
<Image
|
||||
src="/images/bounty_btn.png"
|
||||
alt="wechat"
|
||||
width={93}
|
||||
height={22}
|
||||
style={{ cursor: "pointer", marginTop: '3px' }}
|
||||
/>
|
||||
</Typography>
|
||||
<HoverPopover
|
||||
{...bindPopover(popoverState1)}
|
||||
anchorOrigin={{
|
||||
vertical: 42,
|
||||
horizontal: "left",
|
||||
}}
|
||||
transformOrigin={{
|
||||
vertical: "top",
|
||||
horizontal: "left",
|
||||
}}
|
||||
marginThreshold={16}
|
||||
>
|
||||
<Image
|
||||
src="/images/bounty.png"
|
||||
alt="wechat"
|
||||
width={672}
|
||||
height={491}
|
||||
/>
|
||||
</HoverPopover>
|
||||
</Box>
|
||||
<Link
|
||||
href="https://github.com/chaitin/SafeLine"
|
||||
target="_blank"
|
||||
@@ -87,15 +186,17 @@ export default function NavBar() {
|
||||
<Box mr={3.5}>
|
||||
<Typography
|
||||
{...bindHover(popoverState as any)}
|
||||
variant='body1'
|
||||
variant="body1"
|
||||
sx={{
|
||||
color: popoverState.isOpen ? 'primary.main' : 'common.black',
|
||||
color: popoverState.isOpen
|
||||
? "primary.main"
|
||||
: "common.black",
|
||||
cursor: "pointer",
|
||||
'&:hover': {
|
||||
"&:hover": {
|
||||
color: "primary.main",
|
||||
backgroundColor: "transparent",
|
||||
},
|
||||
transition: 'unset',
|
||||
transition: "unset",
|
||||
}}
|
||||
>
|
||||
微信讨论组
|
||||
@@ -104,11 +205,11 @@ export default function NavBar() {
|
||||
{...bindPopover(popoverState)}
|
||||
anchorOrigin={{
|
||||
vertical: 42,
|
||||
horizontal: 'left',
|
||||
horizontal: "left",
|
||||
}}
|
||||
transformOrigin={{
|
||||
vertical: 'top',
|
||||
horizontal: 'left',
|
||||
vertical: "top",
|
||||
horizontal: "left",
|
||||
}}
|
||||
marginThreshold={16}
|
||||
>
|
||||
@@ -120,7 +221,14 @@ export default function NavBar() {
|
||||
/>
|
||||
</HoverPopover>
|
||||
</Box>
|
||||
<Link href="https://demo.waf-ce.chaitin.cn:9443/dashboard" sx={{ color: "common.black" }} mr={3.5} target="_blank">演示 Demo</Link>
|
||||
<Link
|
||||
href="https://demo.waf-ce.chaitin.cn:9443/dashboard"
|
||||
sx={{ color: "common.black" }}
|
||||
mr={3.5}
|
||||
target="_blank"
|
||||
>
|
||||
演示 Demo
|
||||
</Link>
|
||||
<Button
|
||||
variant="contained"
|
||||
target="_blank"
|
||||
@@ -147,18 +255,25 @@ export default function NavBar() {
|
||||
</Container>
|
||||
</AppBar>
|
||||
<Drawer
|
||||
anchor='right'
|
||||
anchor="right"
|
||||
sx={{ width: "100%" }}
|
||||
variant="temporary"
|
||||
open={open}
|
||||
PaperProps={{
|
||||
style: {
|
||||
width: '100%',
|
||||
width: "100%",
|
||||
},
|
||||
}}
|
||||
onClose={() => setOpen(false)}
|
||||
>
|
||||
<Stack direction="row" justifyContent="space-between" pl={4} pr={0.5} py={1} sx={{ boxShadow: "rgba(0, 0, 0, 0.1) 0px 1px 2px 0px" }}>
|
||||
<Stack
|
||||
direction="row"
|
||||
justifyContent="space-between"
|
||||
pl={4}
|
||||
pr={0.5}
|
||||
py={1}
|
||||
sx={{ boxShadow: "rgba(0, 0, 0, 0.1) 0px 1px 2px 0px" }}
|
||||
>
|
||||
<Box>
|
||||
<SafelineTitle />
|
||||
</Box>
|
||||
@@ -191,8 +306,18 @@ export default function NavBar() {
|
||||
export const SafelineTitle: React.FC = () => {
|
||||
return (
|
||||
<Link href="/">
|
||||
<Grid container flexDirection="row" display="flex" spacing={2} sx={{ marginTop: '0px', minWidth: "192px" }}>
|
||||
<Box width={{ xs: "40px", md: "24px" }} height={{ xs: "43px", md: "26px" }} position="relative">
|
||||
<Grid
|
||||
container
|
||||
flexDirection="row"
|
||||
display="flex"
|
||||
spacing={2}
|
||||
sx={{ marginTop: "0px", minWidth: "192px" }}
|
||||
>
|
||||
<Box
|
||||
width={{ xs: "40px", md: "24px" }}
|
||||
height={{ xs: "43px", md: "26px" }}
|
||||
position="relative"
|
||||
>
|
||||
<Image
|
||||
src="/images/safeline.svg"
|
||||
alt="SafeLine Logo"
|
||||
@@ -207,9 +332,10 @@ export const SafelineTitle: React.FC = () => {
|
||||
ml: { xs: 2, md: 1 },
|
||||
mr: { xs: 0, md: 7 },
|
||||
fontSize: { xs: "24px", md: "16px" },
|
||||
display: 'flex',
|
||||
alignItems: 'center',
|
||||
display: "flex",
|
||||
alignItems: "center",
|
||||
fontFamily: "AlimamaShuHeiTi-Bold",
|
||||
fontWeight: 500,
|
||||
}}
|
||||
>
|
||||
雷池 SafeLine
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
import React from 'react'
|
||||
import React from "react";
|
||||
import { useState, useEffect } from "react";
|
||||
import Message from "@/components/Message";
|
||||
import Modal from "@/components/Modal";
|
||||
import { Box, TextField, Typography, Button } from "@mui/material";
|
||||
import { detectorPoint } from "@/api";
|
||||
|
||||
function Consultation() {
|
||||
const [text, setText] = useState("");
|
||||
@@ -59,7 +60,10 @@ function Consultation() {
|
||||
mb: 4,
|
||||
boxShadow: "0px 15px 25px 0px rgba(15,198,194,0.3)",
|
||||
}}
|
||||
onClick={() => setConsultOpen(true)}
|
||||
onClick={() => {
|
||||
detectorPoint({ type: 1002 });
|
||||
setConsultOpen(true);
|
||||
}}
|
||||
>
|
||||
立即咨询
|
||||
</Button>
|
||||
@@ -78,9 +82,7 @@ function Consultation() {
|
||||
fullWidth
|
||||
size="small"
|
||||
label="手机号"
|
||||
helperText={
|
||||
wrongPhoneNumber ? "手机号格式不正确" : ""
|
||||
}
|
||||
helperText={wrongPhoneNumber ? "手机号格式不正确" : ""}
|
||||
variant="outlined"
|
||||
value={text}
|
||||
onChange={(e) => textHandler(e.target.value)}
|
||||
|
||||
@@ -136,14 +136,20 @@ const FunctionTable = () => {
|
||||
title: "统计分析",
|
||||
data: [
|
||||
{
|
||||
name: "基础统计图表",
|
||||
name: "统计图表",
|
||||
tip: "",
|
||||
experience: <Support />,
|
||||
experience: <Illustrate text="基础统计分析" />,
|
||||
major: <Illustrate text="高级统计分析" />,
|
||||
basics: <Illustrate text="企业级防护数据仪表盘" />,
|
||||
},
|
||||
{
|
||||
name: "攻击日志导出",
|
||||
experience: <NotSupport />,
|
||||
major: <Support />,
|
||||
basics: <Support />,
|
||||
},
|
||||
{
|
||||
name: "高级统计分析与报告",
|
||||
name: "防护报告导出",
|
||||
experience: <NotSupport />,
|
||||
major: <NotSupport />,
|
||||
basics: <Support />,
|
||||
@@ -165,6 +171,30 @@ const FunctionTable = () => {
|
||||
major: <Support />,
|
||||
basics: <Support />,
|
||||
},
|
||||
{
|
||||
name: "检测引擎性能配置",
|
||||
experience: <NotSupport />,
|
||||
major: <Support />,
|
||||
basics: <Support />,
|
||||
},
|
||||
{
|
||||
name: "Syslog 转发",
|
||||
experience: <NotSupport />,
|
||||
major: <Support />,
|
||||
basics: <Support />,
|
||||
},
|
||||
{
|
||||
name: "钉钉、飞书、企微告警",
|
||||
experience: <NotSupport />,
|
||||
major: <Support />,
|
||||
basics: <Support />,
|
||||
},
|
||||
{
|
||||
name: "多用户管理",
|
||||
experience: <NotSupport />,
|
||||
major: <Support />,
|
||||
basics: <Support />,
|
||||
},
|
||||
{
|
||||
name: "多设备集中管理",
|
||||
tip: "",
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
import React from "react";
|
||||
import { alpha, Box, Button, Typography, Stack } from "@mui/material";
|
||||
import dynamic from 'next/dynamic';
|
||||
import dynamic from "next/dynamic";
|
||||
import FunctionTable from "./FunctionTable";
|
||||
import Image from "next/image";
|
||||
import Icon from "@/components/Icon";
|
||||
import { detectorPoint } from "@/api";
|
||||
|
||||
const Consultation = dynamic(() => import('./Consultation'), {
|
||||
const Consultation = dynamic(() => import("./Consultation"), {
|
||||
ssr: false,
|
||||
});
|
||||
|
||||
@@ -32,12 +33,13 @@ const VERSION_LIST = [
|
||||
</Button>
|
||||
),
|
||||
functions: [
|
||||
"Web 攻击防护",
|
||||
"爬虫防护 / 人机验证",
|
||||
"Web 访问控制 / Web 身份认证",
|
||||
"CC 攻击防护 / 频率限制",
|
||||
"智能语义分析 Web 防护",
|
||||
"人机验证 / 爬虫防护",
|
||||
"网站身份认证",
|
||||
"频率限制 / CC 攻击防护",
|
||||
"黑 IP 情报防护",
|
||||
"0 Day 漏洞情报防护",
|
||||
"黑白名单",
|
||||
"",
|
||||
],
|
||||
},
|
||||
{
|
||||
@@ -48,7 +50,15 @@ const VERSION_LIST = [
|
||||
fee_desc: "/年",
|
||||
desc: (
|
||||
<Stack direction="row" justifyContent="center">
|
||||
<Typography variant="subtitle2" mr={1} sx={{ color: alpha("#000", 0.5), textDecoration: "line-through", lineHeight: "20px" }}>
|
||||
<Typography
|
||||
variant="subtitle2"
|
||||
mr={1}
|
||||
sx={{
|
||||
color: alpha("#000", 0.5),
|
||||
textDecoration: "line-through",
|
||||
lineHeight: "20px",
|
||||
}}
|
||||
>
|
||||
原价 ¥3600 /年
|
||||
</Typography>
|
||||
<Image
|
||||
@@ -68,18 +78,26 @@ const VERSION_LIST = [
|
||||
my: 4,
|
||||
boxShadow: "0px 15px 25px 0px rgba(15,198,194,0.3)",
|
||||
}}
|
||||
href="https://rivers.chaitin.cn/?share=85db8d21d63711ee91390242c0a8176b"
|
||||
onClick={() => {
|
||||
detectorPoint({
|
||||
type: 1001,
|
||||
});
|
||||
window.open(
|
||||
"https://rivers.chaitin.cn/?share=85db8d21d63711ee91390242c0a8176b"
|
||||
);
|
||||
}}
|
||||
>
|
||||
立即购买
|
||||
</Button>
|
||||
),
|
||||
functions: [
|
||||
"所有社区版能力",
|
||||
"Web 攻击加强防护",
|
||||
"黑 IP 加强情报防护",
|
||||
"自定义拦截页面",
|
||||
"加强 Web 攻击防护",
|
||||
"高级统计分析",
|
||||
"基于地理位置的访问控制",
|
||||
"上游服务器负载均衡",
|
||||
"自定义拦截页面",
|
||||
"负载均衡",
|
||||
"对外告警",
|
||||
],
|
||||
},
|
||||
{
|
||||
@@ -89,24 +107,25 @@ const VERSION_LIST = [
|
||||
fee: (
|
||||
<Stack direction="row" alignItems="center">
|
||||
<Icon type="icon-zixun" color="#0FC6C2" />
|
||||
<Typography variant="h3" sx={{ lineHeight: "46px", ml: 1 }}>按需定制</Typography>
|
||||
<Typography variant="h3" sx={{ lineHeight: "46px", ml: 1 }}>
|
||||
按需定制
|
||||
</Typography>
|
||||
</Stack>
|
||||
),
|
||||
fee_desc: "",
|
||||
desc: "",
|
||||
operation: (
|
||||
<Consultation />
|
||||
),
|
||||
operation: <Consultation />,
|
||||
functions: [
|
||||
"所有专业版能力",
|
||||
"软件、硬件、云原生等交付形式",
|
||||
"反代、透明、路由、桥接、旁挂等方式部署",
|
||||
"动态防护、拟态防护 等高级防护能力",
|
||||
"企业级管理、合规审计能力",
|
||||
"硬件、云原生等交付形态",
|
||||
"透明、路由、桥接、旁挂等接入方式",
|
||||
"多活、主备、Bypass 等高可用形式",
|
||||
"动态防护、拟态防护等高级防护形式",
|
||||
"分布式集群部署,检测超大规模流量",
|
||||
"承载超大规模流量的分布式集群部署",
|
||||
],
|
||||
},
|
||||
]
|
||||
];
|
||||
|
||||
const Version = () => {
|
||||
return (
|
||||
@@ -128,13 +147,16 @@ const Version = () => {
|
||||
height: { xs: "auto" },
|
||||
borderRadius: "12px",
|
||||
mb: { xs: 2, sm: 2, md: 2 },
|
||||
mr: index < VERSION_LIST.length - 1 ? { xs: 0, sm: 2, md: 4 } : { xs: 0, sm: 0, md: 0 },
|
||||
mr:
|
||||
index < VERSION_LIST.length - 1
|
||||
? { xs: 0, sm: 2, md: 4 }
|
||||
: { xs: 0, sm: 0, md: 0 },
|
||||
position: "relative",
|
||||
bottom: 0,
|
||||
transition: "all 0.5s ease",
|
||||
"&:hover": {
|
||||
boxShadow: "0px 30px 40px 0px rgba(145,158,171,0.11)",
|
||||
transform: "translateY(-16px)"
|
||||
transform: "translateY(-16px)",
|
||||
},
|
||||
}}
|
||||
>
|
||||
@@ -142,14 +164,17 @@ const Version = () => {
|
||||
sx={{
|
||||
px: 3,
|
||||
py: 2,
|
||||
borderRadius: '12px 12px 0px 0px',
|
||||
borderRadius: "12px 12px 0px 0px",
|
||||
backgroundSize: "cover",
|
||||
backgroundPosition: "center center",
|
||||
textAlign: "center",
|
||||
backgroundImage: `url(${item.name_bg})`,
|
||||
}}
|
||||
>
|
||||
<Typography variant="h4" sx={{ fontWeight: 500, color: "common.white" }}>
|
||||
<Typography
|
||||
variant="h4"
|
||||
sx={{ fontWeight: 500, color: "common.white" }}
|
||||
>
|
||||
{item.name}
|
||||
</Typography>
|
||||
</Box>
|
||||
@@ -160,7 +185,7 @@ const Version = () => {
|
||||
flexDirection: "column",
|
||||
alignItems: "center",
|
||||
border: "1px solid #E3E8EF",
|
||||
borderRadius: '0px 0px 12px 12px ',
|
||||
borderRadius: "0px 0px 12px 12px ",
|
||||
borderTop: "none",
|
||||
}}
|
||||
>
|
||||
@@ -168,14 +193,16 @@ const Version = () => {
|
||||
<Typography variant="h3" sx={{ mt: 3, lineHeight: "46px" }}>
|
||||
{item.fee}
|
||||
{item.fee_desc && (
|
||||
<Typography component="span" variant="subtitle2" sx={{ color: alpha("#000", 0.5), height: "20px" }}>
|
||||
<Typography
|
||||
component="span"
|
||||
variant="subtitle2"
|
||||
sx={{ color: alpha("#000", 0.5), height: "20px" }}
|
||||
>
|
||||
{item.fee_desc}
|
||||
</Typography>
|
||||
)}
|
||||
</Typography>
|
||||
<Box sx={{ height: "20px" }}>
|
||||
{item.desc}
|
||||
</Box>
|
||||
<Box sx={{ height: "20px" }}>{item.desc}</Box>
|
||||
<Box>{item.operation}</Box>
|
||||
<FunctionItems items={item.functions} />
|
||||
</Box>
|
||||
@@ -199,7 +226,6 @@ const Version = () => {
|
||||
|
||||
export default Version;
|
||||
|
||||
|
||||
const FunctionItems: React.FC<{ items: any[] }> = ({ items }) => {
|
||||
return (
|
||||
<Box>
|
||||
@@ -212,6 +238,7 @@ const FunctionItems: React.FC<{ items: any[] }> = ({ items }) => {
|
||||
pl: 2,
|
||||
fontSize: "14px",
|
||||
textAlign: "center",
|
||||
minHeight: '14px',
|
||||
// "&:before": {
|
||||
// content: "' '",
|
||||
// position: "absolute",
|
||||
@@ -233,10 +260,11 @@ const FunctionItems: React.FC<{ items: any[] }> = ({ items }) => {
|
||||
|
||||
const Description: React.FC<{ content: string }> = ({ content }) => {
|
||||
return (
|
||||
<Typography variant="subtitle2" sx={{ color: alpha("#000", 0.5), height: "20px" }}>
|
||||
<Typography
|
||||
variant="subtitle2"
|
||||
sx={{ color: alpha("#000", 0.5), height: "20px" }}
|
||||
>
|
||||
{content}
|
||||
</Typography>
|
||||
);
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@ export default function MyApp({ Component, pageProps }: any) {
|
||||
return (
|
||||
<div className='overflow-x-hidden'>
|
||||
<Head>
|
||||
<title>雷池 WAF 社区版 | 下一代 Web 应用防火墙 | 免费安装</title>
|
||||
<title>雷池 WAF 社区版 | 下一代 Web 应用防火墙 | 免费使用</title>
|
||||
<link rel="icon" href="/favicon.ico" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<meta name="keywords" content="WAF,雷池,长亭,社区版,免费,开源,网站防护"></meta>
|
||||
|
||||
@@ -62,7 +62,7 @@ table {
|
||||
|
||||
body {
|
||||
color: rgb(var(--foreground-rgb));
|
||||
font-family: 'PingFang SC, Microsoft YaHei, Hiragino Sans GB, Helvetica Nene, Helvetica, Arial',
|
||||
font-family: PingFang SC, Microsoft YaHei, Hiragino Sans GB, Helvetica Nene, Helvetica, Arial;
|
||||
}
|
||||
|
||||
a:-webkit-any-link {
|
||||
@@ -70,7 +70,7 @@ a:-webkit-any-link {
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'AlimamaShuHeiTi-Bold';
|
||||
font-family: AlimamaShuHeiTi-Bold;
|
||||
src: url('/fonts/AlimamaShuHeiTi-Bold.ttf') format('truetype');
|
||||
font-display: swap;
|
||||
}
|
||||
@@ -112,7 +112,7 @@
|
||||
resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz"
|
||||
integrity sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==
|
||||
|
||||
"@emotion/react@^11.0.0-rc.0", "@emotion/react@^11.4.1", "@emotion/react@^11.5.0", "@emotion/react@11.11.1":
|
||||
"@emotion/react@11.11.1":
|
||||
version "11.11.1"
|
||||
resolved "https://registry.npmjs.org/@emotion/react/-/react-11.11.1.tgz"
|
||||
integrity sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA==
|
||||
@@ -142,7 +142,7 @@
|
||||
resolved "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz"
|
||||
integrity sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==
|
||||
|
||||
"@emotion/styled@^11.3.0", "@emotion/styled@11.11.0":
|
||||
"@emotion/styled@11.11.0":
|
||||
version "11.11.0"
|
||||
resolved "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.0.tgz"
|
||||
integrity sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==
|
||||
@@ -297,7 +297,7 @@
|
||||
prop-types "^15.8.1"
|
||||
react-is "^18.2.0"
|
||||
|
||||
"@mui/material@^5.0.0", "@mui/material@5.14.3":
|
||||
"@mui/material@5.14.3":
|
||||
version "5.14.3"
|
||||
resolved "https://registry.npmjs.org/@mui/material/-/material-5.14.3.tgz"
|
||||
integrity sha512-dlu4SOcCp9Cy+wkcfZ/ns9ZkP40nr/WPgqxX0HmrE0o+dkE1ropY9BbHsLrTlYJCko8yzcC8bLghrD4xqZG1og==
|
||||
@@ -363,16 +363,16 @@
|
||||
prop-types "^15.8.1"
|
||||
react-is "^18.2.0"
|
||||
|
||||
"@next/env@^13.4.3":
|
||||
version "13.5.6"
|
||||
resolved "https://registry.npmjs.org/@next/env/-/env-13.5.6.tgz"
|
||||
integrity sha512-Yac/bV5sBGkkEXmAX5FWPS9Mmo2rthrOPRQQNfycJPkjUAUclomCPH7QFVCDQ4Mp2k2K1SSM6m0zrxYrOwtFQw==
|
||||
|
||||
"@next/env@14.0.1":
|
||||
version "14.0.1"
|
||||
resolved "https://registry.npmmirror.com/@next/env/-/env-14.0.1.tgz"
|
||||
integrity sha512-Ms8ZswqY65/YfcjrlcIwMPD7Rg/dVjdLapMcSHG26W6O67EJDF435ShW4H4LXi1xKO1oRc97tLXUpx8jpLe86A==
|
||||
|
||||
"@next/env@^13.4.3":
|
||||
version "13.5.6"
|
||||
resolved "https://registry.npmjs.org/@next/env/-/env-13.5.6.tgz"
|
||||
integrity sha512-Yac/bV5sBGkkEXmAX5FWPS9Mmo2rthrOPRQQNfycJPkjUAUclomCPH7QFVCDQ4Mp2k2K1SSM6m0zrxYrOwtFQw==
|
||||
|
||||
"@next/eslint-plugin-next@14.0.1":
|
||||
version "14.0.1"
|
||||
resolved "https://registry.npmmirror.com/@next/eslint-plugin-next/-/eslint-plugin-next-14.0.1.tgz"
|
||||
@@ -380,11 +380,51 @@
|
||||
dependencies:
|
||||
glob "7.1.7"
|
||||
|
||||
"@next/swc-darwin-arm64@14.0.1":
|
||||
version "14.0.1"
|
||||
resolved "https://registry.npmmirror.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.0.1.tgz"
|
||||
integrity sha512-JyxnGCS4qT67hdOKQ0CkgFTp+PXub5W1wsGvIq98TNbF3YEIN7iDekYhYsZzc8Ov0pWEsghQt+tANdidITCLaw==
|
||||
|
||||
"@next/swc-darwin-x64@14.0.1":
|
||||
version "14.0.1"
|
||||
resolved "https://registry.npmmirror.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.0.1.tgz"
|
||||
resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.0.1.tgz#7d8498fc680cc8b4d5181bee336818c63779bc5e"
|
||||
integrity sha512-625Z7bb5AyIzswF9hvfZWa+HTwFZw+Jn3lOBNZB87lUS0iuCYDHqk3ujuHCkiyPtSC0xFBtYDLcrZ11mF/ap3w==
|
||||
|
||||
"@next/swc-linux-arm64-gnu@14.0.1":
|
||||
version "14.0.1"
|
||||
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.0.1.tgz#184286794e67bed192de7dbb10d7f040c996f965"
|
||||
integrity sha512-iVpn3KG3DprFXzVHM09kvb//4CNNXBQ9NB/pTm8LO+vnnnaObnzFdS5KM+w1okwa32xH0g8EvZIhoB3fI3mS1g==
|
||||
|
||||
"@next/swc-linux-arm64-musl@14.0.1":
|
||||
version "14.0.1"
|
||||
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.0.1.tgz#e8121b860ebc97a8d2a9113e5a42878430e749d5"
|
||||
integrity sha512-mVsGyMxTLWZXyD5sen6kGOTYVOO67lZjLApIj/JsTEEohDDt1im2nkspzfV5MvhfS7diDw6Rp/xvAQaWZTv1Ww==
|
||||
|
||||
"@next/swc-linux-x64-gnu@14.0.1":
|
||||
version "14.0.1"
|
||||
resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.0.1.tgz#cdc4276b11a10c892fd1cb7dd31e024064db9c3b"
|
||||
integrity sha512-wMqf90uDWN001NqCM/auRl3+qVVeKfjJdT9XW+RMIOf+rhUzadmYJu++tp2y+hUbb6GTRhT+VjQzcgg/QTD9NQ==
|
||||
|
||||
"@next/swc-linux-x64-musl@14.0.1":
|
||||
version "14.0.1"
|
||||
resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.0.1.tgz#4a194a484ceb34fd370e8d1af571493859fb2542"
|
||||
integrity sha512-ol1X1e24w4j4QwdeNjfX0f+Nza25n+ymY0T2frTyalVczUmzkVD7QGgPTZMHfR1aLrO69hBs0G3QBYaj22J5GQ==
|
||||
|
||||
"@next/swc-win32-arm64-msvc@14.0.1":
|
||||
version "14.0.1"
|
||||
resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.0.1.tgz#71923debee50f98ef166b28cdb3ad7e7463e6598"
|
||||
integrity sha512-WEmTEeWs6yRUEnUlahTgvZteh5RJc4sEjCQIodJlZZ5/VJwVP8p2L7l6VhzQhT4h7KvLx/Ed4UViBdne6zpIsw==
|
||||
|
||||
"@next/swc-win32-ia32-msvc@14.0.1":
|
||||
version "14.0.1"
|
||||
resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.0.1.tgz#b8f46da899c279fd65db76f0951849290c480ef9"
|
||||
integrity sha512-oFpHphN4ygAgZUKjzga7SoH2VGbEJXZa/KL8bHCAwCjDWle6R1SpiGOdUdA8EJ9YsG1TYWpzY6FTbUA+iAJeww==
|
||||
|
||||
"@next/swc-win32-x64-msvc@14.0.1":
|
||||
version "14.0.1"
|
||||
resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.0.1.tgz#be3dd8b3729ec51c99ff04b51e2b235756d02b6e"
|
||||
integrity sha512-FFp3nOJ/5qSpeWT0BZQ+YE1pSMk4IMpkME/1DwKBwhg4mJLB9L+6EXuJi4JEwaJdl5iN+UUlmUD3IsR1kx5fAg==
|
||||
|
||||
"@nodelib/fs.scandir@2.1.5":
|
||||
version "2.1.5"
|
||||
resolved "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz"
|
||||
@@ -393,7 +433,7 @@
|
||||
"@nodelib/fs.stat" "2.0.5"
|
||||
run-parallel "^1.1.9"
|
||||
|
||||
"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5":
|
||||
"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2":
|
||||
version "2.0.5"
|
||||
resolved "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz"
|
||||
integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
|
||||
@@ -459,7 +499,7 @@
|
||||
dependencies:
|
||||
"@types/react" "*"
|
||||
|
||||
"@types/react@*", "@types/react@^17.0.0 || ^18.0.0", "@types/react@^18":
|
||||
"@types/react@*", "@types/react@^18":
|
||||
version "18.2.34"
|
||||
resolved "https://registry.npmmirror.com/@types/react/-/react-18.2.34.tgz"
|
||||
integrity sha512-U6eW/alrRk37FU/MS2RYMjx0Va2JGIVXELTODaTIYgvWGCV4Y4TfTUzG8DdmpDNIT0Xpj/R7GfyHOJJrDttcvg==
|
||||
@@ -528,7 +568,7 @@ acorn-jsx@^5.3.2:
|
||||
resolved "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz"
|
||||
integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
|
||||
|
||||
"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.9.0:
|
||||
acorn@^8.9.0:
|
||||
version "8.11.2"
|
||||
resolved "https://registry.npmmirror.com/acorn/-/acorn-8.11.2.tgz"
|
||||
integrity sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==
|
||||
@@ -746,7 +786,7 @@ braces@^3.0.2, braces@~3.0.2:
|
||||
dependencies:
|
||||
fill-range "^7.0.1"
|
||||
|
||||
browserslist@^4.21.10, "browserslist@>= 4.21.0":
|
||||
browserslist@^4.21.10:
|
||||
version "4.22.1"
|
||||
resolved "https://registry.npmmirror.com/browserslist/-/browserslist-4.22.1.tgz"
|
||||
integrity sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==
|
||||
@@ -843,16 +883,16 @@ color-convert@^2.0.1:
|
||||
dependencies:
|
||||
color-name "~1.1.4"
|
||||
|
||||
color-name@~1.1.4:
|
||||
version "1.1.4"
|
||||
resolved "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz"
|
||||
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
|
||||
|
||||
color-name@1.1.3:
|
||||
version "1.1.3"
|
||||
resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz"
|
||||
integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
|
||||
|
||||
color-name@~1.1.4:
|
||||
version "1.1.4"
|
||||
resolved "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz"
|
||||
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
|
||||
|
||||
commander@^4.0.0:
|
||||
version "4.1.1"
|
||||
resolved "https://registry.npmmirror.com/commander/-/commander-4.1.1.tgz"
|
||||
@@ -1163,7 +1203,7 @@ eslint-module-utils@^2.7.4, eslint-module-utils@^2.8.0:
|
||||
dependencies:
|
||||
debug "^3.2.7"
|
||||
|
||||
eslint-plugin-import@*, eslint-plugin-import@^2.28.1:
|
||||
eslint-plugin-import@^2.28.1:
|
||||
version "2.29.0"
|
||||
resolved "https://registry.npmmirror.com/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz"
|
||||
integrity sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==
|
||||
@@ -1248,7 +1288,7 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4
|
||||
resolved "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz"
|
||||
integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==
|
||||
|
||||
eslint@*, "eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8", "eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8", "eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^7.0.0 || ^8.0.0", "eslint@^7.23.0 || ^8.0.0", eslint@^8:
|
||||
eslint@^8:
|
||||
version "8.52.0"
|
||||
resolved "https://registry.npmmirror.com/eslint/-/eslint-8.52.0.tgz"
|
||||
integrity sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg==
|
||||
@@ -1466,7 +1506,7 @@ get-tsconfig@^4.5.0:
|
||||
dependencies:
|
||||
resolve-pkg-maps "^1.0.0"
|
||||
|
||||
glob-parent@^5.1.2:
|
||||
glob-parent@^5.1.2, glob-parent@~5.1.2:
|
||||
version "5.1.2"
|
||||
resolved "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz"
|
||||
integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
|
||||
@@ -1480,30 +1520,11 @@ glob-parent@^6.0.2:
|
||||
dependencies:
|
||||
is-glob "^4.0.3"
|
||||
|
||||
glob-parent@~5.1.2:
|
||||
version "5.1.2"
|
||||
resolved "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz"
|
||||
integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
|
||||
dependencies:
|
||||
is-glob "^4.0.1"
|
||||
|
||||
glob-to-regexp@^0.4.1:
|
||||
version "0.4.1"
|
||||
resolved "https://registry.npmmirror.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz"
|
||||
integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==
|
||||
|
||||
glob@^7.1.3:
|
||||
version "7.2.3"
|
||||
resolved "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz"
|
||||
integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
|
||||
dependencies:
|
||||
fs.realpath "^1.0.0"
|
||||
inflight "^1.0.4"
|
||||
inherits "2"
|
||||
minimatch "^3.1.1"
|
||||
once "^1.3.0"
|
||||
path-is-absolute "^1.0.0"
|
||||
|
||||
glob@7.1.6:
|
||||
version "7.1.6"
|
||||
resolved "https://registry.npmmirror.com/glob/-/glob-7.1.6.tgz"
|
||||
@@ -1528,6 +1549,18 @@ glob@7.1.7:
|
||||
once "^1.3.0"
|
||||
path-is-absolute "^1.0.0"
|
||||
|
||||
glob@^7.1.3:
|
||||
version "7.2.3"
|
||||
resolved "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz"
|
||||
integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
|
||||
dependencies:
|
||||
fs.realpath "^1.0.0"
|
||||
inflight "^1.0.4"
|
||||
inherits "2"
|
||||
minimatch "^3.1.1"
|
||||
once "^1.3.0"
|
||||
path-is-absolute "^1.0.0"
|
||||
|
||||
globals@^13.19.0:
|
||||
version "13.23.0"
|
||||
resolved "https://registry.npmmirror.com/globals/-/globals-13.23.0.tgz"
|
||||
@@ -2003,7 +2036,7 @@ minimist@^1.2.0, minimist@^1.2.6, minimist@^1.2.8:
|
||||
resolved "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz"
|
||||
integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==
|
||||
|
||||
ms@^2.1.1, ms@2.1.2:
|
||||
ms@2.1.2, ms@^2.1.1:
|
||||
version "2.1.2"
|
||||
resolved "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz"
|
||||
integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
|
||||
@@ -2037,7 +2070,7 @@ next-sitemap@^4.2.3:
|
||||
fast-glob "^3.2.12"
|
||||
minimist "^1.2.8"
|
||||
|
||||
next@*, next@14.0.1:
|
||||
next@14.0.1:
|
||||
version "14.0.1"
|
||||
resolved "https://registry.npmmirror.com/next/-/next-14.0.1.tgz"
|
||||
integrity sha512-s4YaLpE4b0gmb3ggtmpmV+wt+lPRuGtANzojMQ2+gmBpgX9w5fTbjsy6dXByBuENsdCX5pukZH/GxdFgO62+pA==
|
||||
@@ -2289,7 +2322,7 @@ postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0:
|
||||
resolved "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz"
|
||||
integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
|
||||
|
||||
postcss@^8, postcss@^8.0.0, postcss@^8.1.0, postcss@^8.2.14, postcss@^8.4.21, postcss@^8.4.23, postcss@>=8.0.9, postcss@8.4.31:
|
||||
postcss@8.4.31, postcss@^8, postcss@^8.4.23:
|
||||
version "8.4.31"
|
||||
resolved "https://registry.npmmirror.com/postcss/-/postcss-8.4.31.tgz"
|
||||
integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==
|
||||
@@ -2322,7 +2355,7 @@ queue-microtask@^1.2.2:
|
||||
resolved "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz"
|
||||
integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
|
||||
|
||||
"react-dom@^17.0.0 || ^18.0.0", react-dom@^18, react-dom@^18.2.0, react-dom@>=16.6.0:
|
||||
react-dom@^18:
|
||||
version "18.2.0"
|
||||
resolved "https://registry.npmmirror.com/react-dom/-/react-dom-18.2.0.tgz"
|
||||
integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==
|
||||
@@ -2350,7 +2383,7 @@ react-transition-group@^4.4.5:
|
||||
loose-envify "^1.4.0"
|
||||
prop-types "^15.6.2"
|
||||
|
||||
"react@^17.0.0 || ^18.0.0", react@^18, react@^18.2.0, "react@>= 16.8.0 || 17.x.x || ^18.0.0-0", react@>=16.6.0, react@>=16.8.0:
|
||||
react@^18:
|
||||
version "18.2.0"
|
||||
resolved "https://registry.npmmirror.com/react/-/react-18.2.0.tgz"
|
||||
integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==
|
||||
@@ -2785,10 +2818,10 @@ typed-array-length@^1.0.4:
|
||||
for-each "^0.3.3"
|
||||
is-typed-array "^1.1.9"
|
||||
|
||||
typescript@^5, typescript@>=3.3.1, typescript@>=4.2.0:
|
||||
version "5.2.2"
|
||||
resolved "https://registry.npmmirror.com/typescript/-/typescript-5.2.2.tgz"
|
||||
integrity sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==
|
||||
typescript@5.4.2:
|
||||
version "5.4.2"
|
||||
resolved "https://registry.npmjs.org/typescript/-/typescript-5.4.2.tgz"
|
||||
integrity sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==
|
||||
|
||||
unbox-primitive@^1.0.2:
|
||||
version "1.0.2"
|
||||
|
||||