AJ Security:实用的 Java Web 安全库

发布于:2025-07-17 ⋅ 阅读:(15) ⋅ 点赞:(0)

基于 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 坐标:


<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中添加如下内容:

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 控制器上的注解声明。例如:
@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 配置

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

拦截校验

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

@GetMapping("/HttpRefererCheck")
@HttpRefererCheck
int HttpRefererCheck();

网站公告

今日签到

点亮在社区的每一天
去签到