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();
相关推荐
德迅云安全-小潘4 小时前
网络安全风险评估:企业安全防护的核心基石
安全·web安全·php
国科安芯5 小时前
质子试验:守护芯片安全的关键防线
嵌入式硬件·安全·fpga开发·性能优化·硬件架构
电子科技圈6 小时前
芯科科技成为全球首家通过PSA 4级认证的物联网芯片厂商巩固其在物联网安全领域的领导地位
科技·物联网·安全·网络安全·边缘计算
cver1237 小时前
塑料可回收物检测数据集-10,000 张图片 智能垃圾分类系统 环保回收自动化 智慧城市环卫管理 企业环保合规检测 教育环保宣传 供应链包装优化
人工智能·安全·计算机视觉·目标跟踪·分类·自动化·智慧城市
计算机毕设定制辅导-无忧学长9 小时前
InfluxDB 权限管理与安全加固(一)
java·struts·安全
用户2990558668712 小时前
WP020——CTF赛题解析-脚本
安全
FreeBuf_14 小时前
微软披露Exchange Server漏洞:攻击者可静默获取混合部署环境云访问权限
网络·安全·microsoft
深盾科技16 小时前
Android 安全编程:Kotlin 如何从语言层保障安全性
android·安全·kotlin
wanhengidc17 小时前
云手机的主要功能都包含哪些?
网络·安全·智能手机
Bruce_Liuxiaowei18 小时前
Chrome与Firefox浏览器安全运维配置命令大全:从攻防到优化的专业实践
chrome·安全·firefox