讲师中心 微信公众号
AI工具推荐 视频效率加速

如何安全地在字符串中插入内容并避免SQL注入风险

冬晨酱_5389

冬晨酱_5389

发布时间:2026-09-10 23:36:21

|

644人浏览过

|

来源于php中文网

原创

如何安全地在字符串中插入内容并避免SQL注入风险

本文介绍在java中动态插入字符串的多种方法,并重点强调构建数据库查询时防范sql注入的安全实践,推荐使用preparedstatement替代字符串拼接。

本文介绍在java中动态插入字符串的多种方法,并重点强调构建数据库查询时防范sql注入的安全实践,推荐使用preparedstatement替代字符串拼接。

在Java开发中,经常需要在已有字符串的特定位置插入新内容(例如向SQL语句中注入数据库名或模式前缀)。你当前通过 indexOf("create table") + 13 手动计算插入偏移量的方式虽能工作,但存在硬编码、可维护性差和易出错等问题。更关键的是——若该操作用于拼接用户可控的数据库查询,将直接导致严重的SQL注入漏洞。

✅ 更健壮的字符串插入方式

无需依赖固定长度偏移量,可通过 String.indexOf() 结合 StringBuilder.insert() 精确定位插入点:

String query = "Create table asdas aaa (int(5), bbb varchar2(20));";
String keyword = "create table";
int startIdx = query.toLowerCase().indexOf(keyword);
if (startIdx != -1) {
    String prefix = "'" + db + "'.";
    StringBuilder sb = new StringBuilder(query);
    // 插入位置:keyword末尾(即 startIdx + keyword.length())
    sb.insert(startIdx + keyword.length(), prefix);
    query = sb.toString();
}

注意:keyword.length() 替代了硬编码的 +13,语义清晰且具备自解释性。

? 字符串组合的现代推荐方案(非SQL场景)

对于普通字符串拼接,优先选用类型安全、可读性强的格式化方式:

方法 示例 特点
String.format() String.format("SELECT * FROM %s.users", schema) Java 5+,支持丰富格式符,线程安全
String.formatted() "SELECT * FROM %s.users".formatted(schema) Java 15+,更简洁,底层调用 format()
StringBuilder.append() new StringBuilder().append("SELECT * FROM ").append(schema).append(".users") 高性能,适合多次追加

⚠️ 重要提醒:以上所有字符串拼接方式均不适用于拼接用户输入的SQL标识符(如表名、列名、数据库名)或值——因为它们无法阻止恶意输入破坏SQL结构。

?️ 构建SQL查询的唯一安全方式:PreparedStatement

当查询参数来自外部(如用户表单、API请求),必须使用 PreparedStatement:

String sql = "SELECT id, name FROM users WHERE status = ? AND created_after = ?";
try (PreparedStatement ps = connection.prepareStatement(sql)) {
    ps.setString(1, "active");               // 安全绑定字符串参数
    ps.setTimestamp(2, Timestamp.valueOf("2024-01-01 00:00:00"));
    ResultSet rs = ps.executeQuery();
}

✅ 优势:

  • 参数被自动转义与类型校验,彻底杜绝SQL注入;
  • 数据库可预编译执行计划,提升性能;
  • 代码清晰,职责分离(SQL结构 vs. 数据内容)。

⚠️ 表名/列名等标识符怎么办?——白名单校验是黄金法则

PreparedStatement 不支持占位符用于表名、列名等SQL标识符。此时绝不可直接拼接用户输入,而应采用严格白名单验证:

private static final Set<String> ALLOWED_TABLES = Set.of("users", "orders", "products");
private static final Pattern IDENTIFIER_PATTERN = Pattern.compile("^[a-zA-Z_][a-zA-Z0-9_]*$");

public String buildQuery(String tableName, String dbName) {
    if (!ALLOWED_TABLES.contains(tableName.toLowerCase()) 
        || !IDENTIFIER_PATTERN.matcher(tableName).matches()) {
        throw new IllegalArgumentException("Invalid table name: " + tableName);
    }
    return String.format("SELECT * FROM `%s`.`%s`", dbName, tableName);
}

? 补充建议:

  • 利用数据库元数据(如 information_schema.columns)动态校验字段是否存在;
  • 最小权限原则:应用数据库账号仅授予必要表的 SELECT/INSERT 权限;
  • 教学/测试环境也应模拟真实防护逻辑,避免养成危险习惯。

总之,字符串操作本身简单,但上下文决定安全性。永远问自己一句:“这个字符串最终会进入哪里?是否可能被恶意控制?” —— 这是写出健壮、安全代码的第一道防线。

热门AI工具

更多
AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

相关专题

更多
mybatis一级缓存和二级缓存
mybatis一级缓存和二级缓存

在MyBatis中,一级缓存和二级缓存是两种不同级别的缓存机制,它们都可以用来提高性能。本专题提供mybatis一级缓存和二级缓存相关文章,大家可以免费阅读。

583

2023.08.21

ibatis和mybatis有什么区别
ibatis和mybatis有什么区别

ibatis和mybatis的区别:1、基本信息不同;2、开发时间不同;3、功能与易用性;4、配置文件;5、入参类型与出参类型;6、返回结果集接受方式;7、语法差异;8、数据库方言支持;9、插件支持;10、社区活跃度;11、全球化支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2062

2024.02.23

mybatis如何配置数据库连接
mybatis如何配置数据库连接

mybatis配置数据库连接的方法:1、指定数据源;2、配置事务管理器;3、配置类型处理器和映射器;4、使用环境元素;5、配置别名。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

446

2024.02.23

mybatis工作原理及流程是什么
mybatis工作原理及流程是什么

mybatis工作原理及流程:1、配置文件;2、接口与映射;3、sql解析与生成;4、执行计划;5、结果处理;6、动态sql;7、缓存机制;8、插件;9、事务管理;10、日志与监控;11、扩展性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

292

2024.02.23

hibernate和mybatis有哪些区别
hibernate和mybatis有哪些区别

hibernate和mybatis的区别:1、实现方式;2、性能;3、对象管理的对比;4、缓存机制。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

302

2024.02.23

Java MyBatis框架
Java MyBatis框架

本专题专注于Java主流ORM框架MyBatis的应用,系统讲解SQL映射、动态SQL、结果映射、分页查询、缓存机制与多表关联等核心内容,并结合企业管理系统、电商平台和后台管理项目实战,帮助学员全面掌握高效的数据库持久层开发技能。

5149

2025.08.26

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

160

2026.09.23

Buffalo框架路由与请求处理实操指南
Buffalo框架路由与请求处理实操指南

本专题讲解Buffalo框架路由与请求处理机制,涵盖路由注册与分组、资源路由、Handler编写规范、Context上下文方法、参数绑定、中间件编写挂载、Session与Cookie读写、Flash消息及错误页面定制方法。

80

2026.09.23

Buffalo框架零基础入门教程
Buffalo框架零基础入门教程

本专题整理Buffalo框架入门内容,涵盖Go环境准备、buffalo CLI安装、新项目生成、目录结构说明、dev热加载启动、数据库连接配置与常见报错排查,帮助新手按约定优于配置的思路跑通第一个Buffalo框架应用。

80

2026.09.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP开发基础之数据库篇(PDO)
PHP开发基础之数据库篇(PDO)

共10课时 | 2.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn