AJ Security:实用的 Java Web 安全库

基于 Spring/HandlerInterceptor 拦截器机制,抽象一套过滤/校验的机制,形成统一的一套调用链,可灵活配置并扩展。本安全框架架构简单,代码精炼,没有其他额外的依赖,适用于任何基于 Spring 的项目。Spring Boot 程序引入 jar 包即可开箱即用。

本框架的功能有:

  • HTTP Web 安全

    • HTTP Referer 校验
    • 时间戳加密 Token 校验
    • IP 白名单/黑名单
    • 防止重复提交数据
    • 根据 IP 地域限制(TODO)
  • 一般性 Web 校验

    • 防止 XSS 跨站攻击
    • 防止 CRLF 攻击
    • Cookie 容量检查
  • HTTP 标准认证

    • HTTP Basic Auth 认证
    • HTTP Digest Auth 认证
  • 验证码 Captcha 机制

    • 简单 Java 图片验证码
    • 基于 kaptcha 的图片验证码
    • 基于 Google Recaptcha 的验证码
    • 基于 CloudFlare Turnstile 的验证码
  • API 接口功能

    • 限流限次数(TODO)
  • 其他实用功能

    • 实体字段脱敏
    • API 接口加解密

AJ Security 的代码量不多(JAR 约 100kb 大小),而且都是很简单易懂的代码。另外没啥第三方依赖,适合 Java8+。

源代码

本项目采用 Apache License 协议开源。

相关链接

用户手册 | JavaDoc | DeepWiki 页面

安装

本组件与 Spring Boot 程序无缝衔接。添加依赖后,即可在 Spring Boot 项目中使用。Maven 坐标:

xml 复制代码
<dependency>
    <groupId>com.ajaxjs</groupId>
    <artifactId>aj-security</artifactId>
    <version>1.0</version>
</dependency>

在 Java 8 + SpringBoot2.7 通过测试。

当前不支持非 Spring 程序。如果要在传统 Spring MVC 程序中使用,可能要针对配置的相关机制进行修改。

演示程序

我们于源码中附带有演示程序 Sample 可供安装配置参考,同时也作为测试用例的一部分,包含了各个安全组件的演示。浏览源码aj-security-samples目录,这是一个标准的SpringBoot v2.7 工程。执行FooApp类的main()函数即可启动该演示程序。

配置

开发者与 AJ Security 打交道更多是通过配置文件进行配置的。在 Spring 配置 YAML 文件application.yml中添加如下内容:

yaml 复制代码
security:
  HttpReferer: # Referer 拦截
    globalCheck: false # 全局检查
    enabled: true
    allowedReferrers:
      - https://example.com
      - https://another-example.com
      - https://my-site.com

  TimeSignature: # 时间戳控制
    enabled: true
    secretKey: der3@x7Az#2 # 密钥,必填的

  IpList: # ip 白名单/黑名单
    globalCheck: false # 全局检查
    enabled: true
    whiteList:
      - 192.168.1.1
      - 192.168.1.2

  HttpBasicAuth: # HTTP Basic 认证
    globalCheck: true # 全局检查
    enabled: false
    username: admin
    password: admin

  HttpDigestAuth: # HTTP Digest 认证
    globalCheck: true # 全局检查
    enabled: false
    username: admin
    password: admin2
  EncryptedBody:
    publicKey: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCmkKluNutOWGmAK2U80hM9JtzsgLAlgvHqncakqwhruE9TIXUQFDRKsIBQwN+3rLC76kyOl4U+eBefLaGQGJBZVq0qwIHBe4kfH0eJXaHyG/i9H2Iph1cyY6cn6ocPta6ZmSuOIcx4yLlpCgq5eDRigHs0AR418ZTlRItlhrY9+wIDAQAB
    privateKey: MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAKaQqW42605YaYArZTzSEz0m3OyAsCWC8eqdxqSrCGu4T1MhdRAUNEqwgFDA37essLvqTI6XhT54F58toZAYkFlWrSrAgcF7iR8fR4ldofIb+L0fYimHVzJjpyfqhw+1rpmZK44hzHjIuWkKCrl4NGKAezQBHjXxlOVEi2WGtj37AgMBAAECgYBj9sX4o3UtG9qVVXX4votVVBGaztDocmIF0JL7GLqBC6hv19CNydJoUO1xiY+6iCW5YbB4k28gQqrKmXQxKszWFdd1NTHOKS3nti8I2QNc4T9FF34YvYh/WQlRw7dHmYUl/MCm6U6yVE7XK8GoYYOyAyclXuFR+SRw8/gHsoAYoQJBAPQ3L+K47QSujMSzu8ZcdRingN25VS8r790A18WNxtK9l/7b3l8aTUXmeGcjLpQDnx158jQ32fTUki5aa2eGDp0CQQCumkCpTgcvx0Ys66aXKnpaexWGWDK/ui9hY7lRdd2XijK30Uo2TlQ1ujXYjodbJJUAELE3UAC+0yj8W8Edf093AkAzrHWyaGSmZ/SbLlieCTQxqkenIq72kzpmreX6BBy8vKcrowQzZVJSZwi08gnKAdYqG4J3MBYrKstfiXxOZFw1AkA6+3radrRwzHWFWTnWmQ/qHug/kO3b3M6CrMh+nz1zIslNVVMnk0BZQgVMmaFaBbqb4gerssf9rqGK1ogfKdGzAkBQzGcbSAtTlCAMNMnOXphIvFQ/GnxlPwwr23ysyt0k14SOwGNfND4rXM2rTzjz+2yF20tGdGgmXfwnvKOaCc1N
    enabled: true
  ParamsSign:
    enabled: true
    secretKey: der3@x7Az42

可见在security中有各个安全组件的配置。抽象来看,主要有个配置是各个组件共用的,分别是enabledglobalCheck

  • enabled是否激活该组件。若为false则不运行该组件。我们约定,只要某组件的enabledtrue,则该组件会运行,否则不运行(而且不创建相关对象,以节省资源)
  • globalCheck是否全局检查。若为true则所有请求都会检查该组件,若为false则只有匹配 URL 的请求才会检查该组件。匹配的方式通过在 Spring 控制器上的注解声明。例如:
java 复制代码
@GetMapping("/HttpRefererCheck")
@HttpRefererCheck
int HttpRefererCheck();

各个组件的详细配置方式请参考其各个章节。

基本原理

我们提供了近十多种安全组件,几乎都是与 Spring 框架深度绑定,充分利用了 Spring 的可扩展机制与灵活的配置机制。 多数组件通过HandlerInterceptor拦截器实现,其他特殊组件采用HandlerMethodArgumentResolver、传统的Servlet FilterHttpMessageConverter均有。

应用列子:HTTP Referer 校验

HTTP Referer 校验(也称为"Referer 检查")是一种常见的 Web 安全措施,其原理是:后端服务器在接收请求时检查请求头中的 Referer 字段,判断请求来源是否为信任的域名或页面。

基本原理

  1. 客户端(浏览器)在发起 HTTP 请求时,会在请求头里带上Referer,指明请求的来源页面地址。
  2. 服务器端在收到请求后,读取Referer,判断其是否为受信任的来源。
  3. Referer不符合要求,则拒绝请求或返回错误。

常用场景

  • 表单提交、接口调用等敏感操作的来源校验
  • 防止 CSRF 攻击
  • 防盗链(如图片、视频资源只允许本域名访问)

注意事项

  • Referer 不是所有请求都带(如直接输入网址、某些浏览器隐私模式、HTTPS 到 HTTP)
  • Referer 容易被伪造,不能作为唯一安全手段,只能作为补充
  • 建议结合 CSRF Token、Cookie 验证等多重措施

使用方式

yaml 配置

yaml 复制代码
security:
  HttpReferer: # Referer 拦截
    globalCheck: false # 全局检查
    enabled: true
    allowedReferrers:
      - https://example.com
      - https://another-example.com
      - https://my-site.com

拦截校验

在使用的接口上添加@HttpRefererCheck注解:

java 复制代码
@GetMapping("/HttpRefererCheck")
@HttpRefererCheck
int HttpRefererCheck();
相关推荐
盟接之桥1 小时前
盟接之桥说制造:在安全、确定与及时之间,构建品质、交期与反应速度的动态平衡
大数据·运维·安全·汽车·制造·devops
Suckerbin2 小时前
DarkHole: 2靶场渗透
笔记·安全·web安全·网络安全
喜葵2 小时前
前端安全防护深度实践:从XSS到供应链攻击的全面防御
前端·安全·xss
泰迪智能科技4 小时前
案例分享|企微智能会话风控系统:为尚丰盈铝业筑牢沟通安全防线
安全·企业微信
lingggggaaaa5 小时前
小迪安全v2023学习笔记(七十八讲)—— 数据库安全&Redis&CouchDB&H2database&未授权&CVE
redis·笔记·学习·算法·安全·网络安全·couchdb
MoloXuanhe6 小时前
[TryHackMe]Wordpress: CVE-2021-29447(wp漏洞利用-SSRF+WpGetShell)
运维·网络·安全·tryhackme·thm
wanhengidc6 小时前
网页版的云手机都有哪些优势?
运维·网络·安全·游戏·智能手机
czijin8 小时前
【论文阅读】Security of Language Models for Code: A Systematic Literature Review
论文阅读·人工智能·安全·语言模型·软件工程
2501_915921438 小时前
iOS混淆工具实战 在线教育直播类 App 的课程与互动安全防护
android·安全·ios·小程序·uni-app·iphone·webview
monster_风铃9 小时前
小补充: IPv6 安全RA
网络·安全·智能路由器