当前位置: 首页 > news >正文

第九站:Java黑——安全编码的坚固防线(第②篇)

4. 验证和过滤输入数据示例:使用Apache Commons Lang

对输入数据进行验证和过滤是防止多种安全漏洞的关键步骤,包括但不限于SQL注入和命令注入。Apache Commons Lang库提供了一些实用方法来帮助进行字符串操作和验证。以下是一个简单的示例,展示如何使用它来检查输入是否只包含数字和字母,从而防止不安全的字符输入:

首先,确保你的项目中已经包含了Apache Commons Lang库。如果是Maven项目,在pom.xml中加入以下依赖:

<dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.12.0</version>
</dependency>

然后,使用其提供的方法来验证用户输入:

import org.apache.commons.lang3.StringUtils;public class InputValidationExample {public static void main(String[] args) {String userInput = "HelloWorld123";if (StringUtils.isAlphanumeric(userInput)) {System.out.println("The input is valid.");} else {System.out.println("The input contains invalid characters.");}}
}

5. 使用Spring Security进行身份验证和授权

Spring Security是一个强大的安全框架,用于处理认证(验证用户身份)和授权(控制用户访问资源的权限)。以下是一个基本的Spring Security配置示例,展示了如何设置基本的表单登录和权限控制:

首先,确保你的项目中包含了Spring Security依赖。对于Maven项目:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId>
</dependency>

接着,配置Spring Security。在Spring Boot应用中,你可以在application.ymlapplication.properties中进行基本配置,或者创建一个Java配置类,例如:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/resources/**", "/signup", "/about").permitAll() // 公开资源.antMatchers("/admin/**").hasRole("ADMIN") // 管理员角色才能访问.anyRequest().authenticated() // 其他请求需要认证.and().formLogin(); // 启用表单登录}// 配置用户详细信息服务等其他安全设置...
}

6. 使用HTTPS和SSL/TLS进行安全通信

在Java Web应用中,使用HTTPS协议和SSL/TLS证书可以确保数据在传输过程中的安全。以下是一个基于Spring Boot配置HTTPS连接的简要示例:

首先,你需要一个SSL证书。这可以通过购买或使用自签名证书进行测试。假设你的证书和私钥文件名为server.crtserver.key,你可以这样配置Spring Boot:

application.propertiesapplication.yml中:

server:port: 8443ssl:enabled: truekey-store:classpath:server.p12 # 如果是PKCS12格式的密钥库key-store-password: yourKeystorePasswordkeyStoreType: PKCS12 # 根据你的密钥库类型调整keyAlias: tomcat # 密钥别名

或者,如果你直接使用.key.crt文件:

server:port: 8443ssl:enabled: truekey-store-type: PEMkey-store:classpath:server.keykey-password: yourPrivateKeyPasswordtrust-store:classpath:server.crt

确保你的密钥和证书文件被正确地放置在项目的类路径下,并且密码正确无误。

通过这些额外的示例,我们可以看到,从数据验证、框架集成到网络通信安全,Java应用的每个层面都需要细心考虑和配置,以构建一个全面安全的应用环境。

7. 使用Shiro进行权限控制与会话管理

Apache Shiro是一个强大且易用的安全框架,它简化了身份验证、授权、会话管理和加密等功能的实现。以下是一个基础的Shiro配置示例,展示了如何进行用户身份验证及角色权限控制:

首先,确保你的项目中包含了Shiro的依赖。对于Maven项目:

<dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring</artifactId><version>1.9.0</version>
</dependency>

接着,配置Shiro。在Spring应用上下文中定义Shiro的配置类:

@Configuration
public class ShiroConfig {@Beanpublic SecurityManager securityManager(Realm realm) {DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();securityManager.setRealm(realm);return securityManager;}@Beanpublic Realm realm() {// 这里可以配置自己的Realm,用于认证和授权逻辑return new IniRealm("classpath:shiro.ini");}@Beanpublic ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();factoryBean.setSecurityManager(securityManager);Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();filterChainDefinitionMap.put("/login", "anon"); // 登录页面匿名访问filterChainDefinitionMap.put("/logout", "logout"); // 注销操作filterChainDefinitionMap.put("/**", "authc"); // 其他请求需要认证factoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);return factoryBean;}
}

同时,你需要一个配置文件(如shiro.ini)来定义用户、角色和权限:

[users]
admin = password, admin
guest = guest, user[roles]
admin = *
user = read, write
guest = read

8. 使用HMAC进行消息完整性验证

HMAC(Hash-based Message Authentication Code)是一种利用哈希函数和密钥来验证消息完整性的方法。在Java中,可以使用java.security包来实现。以下是一个简单的HMAC生成和验证示例:

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;public class HMACExample {public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeyException {String message = "This is a secret message.";String key = "MySuperSecretKey";// 生成HMACString hmac = generateHMAC(message, key);System.out.println("Generated HMAC: " + hmac);// 验证HMACboolean isValid = verifyHMAC(message, key, hmac);System.out.println("HMAC Verification: " + isValid);}public static String generateHMAC(String data, String keyString) throws NoSuchAlgorithmException, InvalidKeyException {SecretKeySpec keySpec = new SecretKeySpec(keyString.getBytes(StandardCharsets.UTF_8), "HmacSHA256");Mac mac = Mac.getInstance("HmacSHA256");mac.init(keySpec);byte[] hmacBytes = mac.doFinal(data.getBytes(StandardCharsets.UTF_8));return Base64.getEncoder().encodeToString(hmacBytes);}public static boolean verifyHMAC(String originalData, String keyString, String hmacToVerify) throws NoSuchAlgorithmException, InvalidKeyException {String generatedHMAC = generateHMAC(originalData, keyString);return generatedHMAC.equals(hmacToVerify);}
}

9. 使用JWT(JSON Web Tokens)进行安全认证

JWT是一种常用的安全认证方式,它允许双方之间安全地传输信息。以下是一个简单的JWT生成和验证示例,使用jjwt库:

首先,添加jjwt依赖到你的项目(Maven为例):

<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-api</artifactId><version>0.11.2</version>
</dependency>
<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-impl</artifactId><version>0.11.2</version>
</dependency>
<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-jackson</artifactId> <!-- 或 jjwt-gson 如果你使用Gson --><version>0.11.2</version>
</dependency>

然后,编写JWT的生成与验证代码:

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;
import javax.crypto.SecretKey;public class JWTExample {public static void main(String[] args) {// 生成密钥SecretKey key = Keys.secretKeyFor(SignatureAlgorithm.HS256);// 生成JWTString jwt = Jwts.builder().setSubject("Alice").signWith(key).compact();System.out.println("Generated JWT: " + jwt);// 验证JWTtry {Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(jwt);System.out.println("JWT Verification: Success");} catch (Exception e) {System.out.println("JWT Verification: Failed");}}
}

以上示例覆盖了权限控制、消息完整性验证以及现代Web应用中常用的JWT认证技术,进一步丰富了Java安全编码的实践案例。

10. 实现线程池管理

在Java中,ExecutorService接口和其相关实现类提供了创建和管理线程池的能力,这对于执行大量短期异步任务非常有用。下面是一个使用线程池执行任务并优雅关闭线程池的例子:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;public class ThreadPoolExample {public static void main(String[] args) {// 创建固定大小的线程池ExecutorService executor = Executors.newFixedThreadPool(5);// 提交任务到线程池执行for (int i = 0; i < 10; i++) {int taskId = i;executor.submit(() -> {System.out.println("Task ID " + taskId + " is running by " + Thread.currentThread().getName());try {Thread.sleep(1000); // 模拟耗时操作} catch (InterruptedException e) {Thread.currentThread().interrupt();System.out.println("Thread interrupted: " + e.getMessage());}});}// 关闭线程池,不再接受新任务,等待所有已提交的任务完成executor.shutdown();try {// 等待直到所有任务完成,最多等待1分钟if (!executor.awaitTermination(1, TimeUnit.MINUTES)) {executor.shutdownNow(); // 强制关闭,取消正在执行的任务System.out.println("ThreadPool did not terminate in time, forcing shutdown.");} else {System.out.println("All tasks completed.");}} catch (InterruptedException e) {executor.shutdownNow();Thread.currentThread().interrupt();System.out.println("Interrupted while waiting for tasks to complete.");}}
}

11. 利用CompletableFuture进行异步编程

CompletableFuture是Java 8引入的一个强大的异步编程工具,它支持非阻塞式操作和链式调用。下面是一个简单示例,展示了如何使用CompletableFuture进行异步任务处理并组合结果:

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;public class CompletableFutureExample {public static void main(String[] args) {CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> {simulateDelay(1000); // 模拟延迟return "Hello";});CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> {simulateDelay(2000); // 模拟延迟return "World";});// 当两个Future都完成时,组合它们的结果CompletableFuture<String> combinedFuture = future1.thenCombine(future2, (s1, s2) -> s1 + " " + s2);try {// 获取最终结果String result = combinedFuture.get();System.out.println(result);} catch (InterruptedException | ExecutionException e) {e.printStackTrace();}}private static void simulateDelay(int millis) {try {Thread.sleep(millis);} catch (InterruptedException e) {Thread.currentThread().interrupt();}}
}

12. 使用Spring Boot实现RESTful API

Spring Boot极大简化了创建基于Spring的应用程序的过程,特别是用于开发RESTful服务。下面是一个基本的Spring Boot应用,它暴露了一个CRUD操作的REST API来管理用户资源:

首先,确保你的项目包含Spring Boot Starter Web依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>

然后,创建一个简单的User实体类和对应的Repository、Service、Controller层:

// User.java
public class User {private Long id;private String name;// Getter & Setter
}// UserRepository.java
public interface UserRepository extends JpaRepository<User, Long> {}// UserService.java
@Service
public class UserService {@Autowiredprivate UserRepository userRepository;// CRUD操作方法
}// UserController.java
@RestController
@RequestMapping("/api/users")
public class UserController {@Autowiredprivate UserService userService;@GetMappingpublic List<User> getUsers() {return userService.getAllUsers();}@PostMappingpublic ResponseEntity<User> createUser(@RequestBody User user) {User savedUser = userService.createUser(user);return ResponseEntity.ok(savedUser);}// 更多CRUD操作的映射...
}

这些示例涵盖了从并发编程、异步处理到构建RESTful服务的多个方面,展示了Java在实际开发中的灵活性和强大功能。

相关文章:

第九站:Java黑——安全编码的坚固防线(第②篇)

4. 验证和过滤输入数据示例&#xff1a;使用Apache Commons Lang 对输入数据进行验证和过滤是防止多种安全漏洞的关键步骤&#xff0c;包括但不限于SQL注入和命令注入。Apache Commons Lang库提供了一些实用方法来帮助进行字符串操作和验证。以下是一个简单的示例&#xff0c;…...

如何优雅的删除正式环境中的大表

引起 MySQL 数据库性能抖动的原因有很多,比如大事务、定时批量查询等,而这些原因我们一般都会注意到。但是,有一个引起性能抖动的原因却经常被我们忽视,那就是在生产环境删除无用的大表,即 DROP TABLE。 一、为什么要 DROP TABLE? 生产环境中,为什么要 DROP TABLE?相…...

Vulnhub-DC-1,7

靶机IP:192.168.20.141 kaliIP:192.168.20.128 网络有问题的可以看下搭建Vulnhub靶机网络问题(获取不到IP) 前言 1和7都是Drupal的网站&#xff0c;只写了7&#xff0c;包含1的知识点 信息收集 用nmap扫描端口及版本号 进入主页查看作者给的提示&#xff0c;不是暴力破解的…...

使用MySQL全文索引实现高效搜索功能

MySQL全文索引是MySQL提供的一种高效的搜索功能&#xff0c;可以快速地搜索文本内容。全文索引可以用于搜索大量文本数据&#xff0c;通常应用在文章、博客、论坛等需要搜索的场景中。 什么是MySQL全文索引 MySQL全文索引是一种用于快速搜索文本内容的索引技术。它可以在存储和…...

数据结构学习笔记-图

1.图的存储 &#xff08;1&#xff09;邻接矩阵法 #define MaxVertexNum 100 //顶点数目的最大值 typedef struct{char Vex[MaxVertexNum]; //顶点表int Edge[MaxVertexNum][MaxVertexNum]; //邻接矩阵表&#xff0c;边表int vexnum,arcnum; //图的当前顶点数和边…...

【归并排序】| 详解归并排序核心代码之合并两个有序数组 力扣88

&#x1f397;️ 主页&#xff1a;小夜时雨 &#x1f397;️专栏&#xff1a;动态规划 &#x1f397;️如何活着&#xff0c;是我找寻的方向 目录 1. 题目解析2. 代码 1. 题目解析 题目链接: https://leetcode.cn/problems/merge-sorted-array/description/ 本道题是归并排序的…...

51单片机STC89C52RC——2.3 两个独立按键模拟控制LED流水灯方向

目的 按下K1键LED流水向左移动 按下K2键LED流水向右移动 一&#xff0c;STC单片机模块 二&#xff0c;独立按键 2.1 独立按键位置 2.2 独立按键电路图 这里要注意一个设计的bug P3_1 引脚对应是K1 P3_0 引脚对应是K2 要实现按一下点亮、再按一下熄灭&#xff0c;我们就需…...

Neo4j连接

终端输入&#xff1a; neo4j console 浏览器访问&#xff1a;http://localhost:7474/ 输入用户名和密码&#xff1a;neo4j&#xff0c; 梦想密码&#xff08;首次neo4j&#xff09; 代码连接用新的服务器地址&#xff1a; g Graph(neo4j://localhost:7687, auth(neo4j, ))…...

List 列表

文章目录 一、什么是 List 列表1.1 创建 List 列表的方式1.2 列表的新增函数方法1.3 列表的删除函数方法1.4 修改列表数据的方法1.5 列表的查询函数方法1.6 列表的排序和反序1.7 列表的复制 一、什么是 List 列表 List 列表&#xff1a;该数据类型定义的变量可以理解为是一个数…...

nginx ws长连接配置

nginx ws长连接配置 http根节点下配上 map $http_upgrade $connection_upgrade {default upgrade; close;}如下&#xff1a; server服务节点下&#xff0c;后端接口的代理配置 proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connec…...

Windows下访问wsl的数据

Windows下访问wsl的数据 有些人感受到的是雨&#xff0c;而很多人感受到的只有淋湿。 Windows下的wsl说实话还是挺不错的&#xff0c;对于开发而言&#xff0c;效果相当的可以。 比如在某个文件夹&#xff0c;Windows编辑好代码后&#xff0c;直接右键打开wsl&#xff0c;就可…...

机器学习笔记 - 用于3D数据分类、分割的Point Net简述

一、简述 在本文中,我们将了解Point Net,目前,处理图像数据的方法有很多。从传统的计算机视觉方法到使用卷积神经网络到Transformer方法,几乎任何 2D 图像应用都会有某种现有的方法。然而,当涉及到 3D 数据时,现成的工具和方法并不那么丰富。3D 空间中一个工具就是Point …...

vscode 连接 GitHub

目录 vscode连接github一、解决 github 登录问题二、通过 SSH 连接 github1、只有一个 git 账号2、切换 git 账号3、在两个账号之间切换 vscode 连接 gitee一、通过 HTTPS 连接二、通过 SSH 连接 vscode连接github 在 vscode 中首次使用 git push 命令时会要求输入 github 账户…...

集合java

1.集合 ArrayList 集合和数组的优势对比&#xff1a; 长度可变 添加数据的时候不需要考虑索引&#xff0c;默认将数据添加到末尾 package com.itheima;import java.util.ArrayList;/*public boolean add(要添加的元素) | 将指定的元素追加到此集合的末尾 | | p…...

智能体(Agent)实战——从gpts到auto gen

一.GPTs 智能体以大模型作为大脑&#xff0c;同时配备技能&#xff0c;使其能够完成具体的任务。同时&#xff0c;为了应用于垂直领域&#xff0c;我们需要为大模型定义一个角色&#xff0c;并构建知识库。最后&#xff0c;定义完整的流程&#xff0c;使其完成整个任务。以组会…...

PyTorch 张量数据类型

【数据类型】Python 与 PyTorch 常见数据类型对应&#xff1a; 用 a.type() 获取数据类型&#xff0c;用 isinstance(a, 目标类型) 进行类型合法化检测 >>> import torch >>> a torch.randn(2,3) >>> a tensor([[-1.7818, -0.2472, -2.0684],[ 0.…...

奇思妙想-可以通过图片闻见味道的设计

奇思妙想-可以通过图片闻见味道的设计 偷闲半日享清闲&#xff0c;炭火烧烤乐无边。肉串飘香引客至&#xff0c;笑语欢声绕云间。人生难得几回醉&#xff0c;且把烦恼抛九天。今宵共饮开怀酒&#xff0c;改日再战新篇章。周四的傍晚&#xff0c;难得的闲暇时光让我与几位挚友相…...

装饰者模式(设计模式)

装饰模式就是对一个类进行装饰&#xff0c;增强其方法行为&#xff0c;在装饰模式中&#xff0c;作为原来的这个类使用者还不应该感受到装饰前与装饰后有什么不同&#xff0c;否则就破坏了原有类的结构了&#xff0c;所以装饰器模式要做到对被装饰类的使用者透明&#xff0c;这…...

ADB调试命令大全

目录 前言命令大全1.显示当前运行的全部模拟器&#xff1a;adb devices2.启动ADB: adb start-server3.停止ADB: adb kill-server4.安装应用程序&#xff1a; adb install -r [apk文件]5.卸载应用程序&#xff1a; adb uninstall [packagename]6.将手机设备中的文件copy到本地计…...

查看npm版本异常,更新nvm版本解决问题

首先说说遇见的问题&#xff0c;基本上把nvm&#xff0c;npm的坑都排了一遍 nvm版本导致npm install报错 Unexpected token ‘.‘install和查看node版本都正确&#xff0c;结果查看npm版本时候报错 首先就是降低node版本… 可以说基本没用&#xff0c;如果要降低版本的话&…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...

在 Spring Boot 项目里,MYSQL中json类型字段使用

前言&#xff1a; 因为程序特殊需求导致&#xff0c;需要mysql数据库存储json类型数据&#xff0c;因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...

LangFlow技术架构分析

&#x1f527; LangFlow 的可视化技术栈 前端节点编辑器 底层框架&#xff1a;基于 &#xff08;一个现代化的 React 节点绘图库&#xff09; 功能&#xff1a; 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...