强化 SQL 语句

简介: 应结合参数化查询、预编译语句等技术防止SQL注入,严格校验输入并转义特殊字符。错误信息需捕获并屏蔽,避免泄露数据库细节,辅助攻击者。预编译语句若未正确使用绑定变量,仍存在风险。

除了严格的输入验证之外,还应综合使用 ASP.NET 中的参数化查询、Java 中的准备语句或其他语言中的类似技术。在将 SQL 语句传递到底层数据库系统之前,每种技术都会执行所有必需的危险字符转义。
以下示例描述了 Java 中准备好的语句的使用,并说明了如何在没有用户提供的数据的情况下构建 SQL 语句,然后以无法更改 SQL 语句的结构和意图的方式使用数据进行扩充:

String sql = "select * from Users where (用户名 = ? 和密码 = ?)";

// 准备语句
prepareStmt = connection.prepareStatement(sql);
preparedStmt.setString(1, 提交的用户名);
preparedStmt.setString(2, 提交密码);

// 结果
preparedStmt.executeQuery();
请注意,准备好的陈述和类似技术并不是万能药;如果在没有绑定变量的情况下错误地使用它们,它们并不比传统构造的动态查询更安全。以下示例说明了 Java 中预准备语句的错误使用:
String sql = "select * from Users where (用户名 = '" + SubmittedUsername +
"' 和密码 = '" + SubmittedPassword + "')"; 准备语句prepareStmt = connection.prepareStatement(sql); 结果 = preparedStmt.executeQuery();
除了确保 SQL 语句的意图不会被用户提供的数据更改之外,应用程序还应该在 SQL 生成的错误消息到达最终用户之前捕获并删除它们。尽管这种保护措施可能会妨碍开发人员排除应用程序错误的能力(可以通过额外的后端日志记录轻松克服这种错误),但 SQL 错误的呈现将极大地帮助攻击者成功利用 SQL 注入漏洞。以下示例是一个过于冗长的错误消息:
com.mysql.jdbc.DBException。MySQL SyntaxErrorException:table“ sqlInjectionTest .test” doesn't exists
at com.mysql.jdbc.SQLError.createSQLException( SQLError.java:936 )
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2985)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1631)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1723)
at com.mysql.jdbc.Connection.execSQL(Connection.java:3277)
at com.mysql.jdbc.Connection.execSQL(Connection.java:3206)
at com.mysql.jdbc.Statement.executeQuery(Statement.java:1232)
at sqlInjectionBefore.main(before.java:28)
此错误消息表明应用程序正在使用 Java 编程语言和 MySQL 数据库平台,并且查询的数据库名为“sqlInjectionTest”。每条信息都可以帮助攻击者制作他们的应用程序输入,这增加了他们成功的几率。

相关文章
|
11月前
|
SpringCloudAlibaba Java Nacos
SpringCloud Alibaba诞生
阿里基于Spring Cloud打造Alibaba生态,推出Nacos、Sentinel、Seata等核心组件,覆盖服务发现、配置管理、流量控制与分布式事务,形成完整微服务解决方案,获Spring官方认可,推动Spring Cloud在企业级场景高效落地。
|
Kubernetes 安全 API
国内首个云上容器ATT&CK攻防矩阵发布,阿里云助力企业容器化安全落地
本文对云上容器ATT&CK攻防矩阵做了详细阐述,希望能帮助开发和运维人员了解容器的安全风险和落地安全实践。
17038 1
国内首个云上容器ATT&CK攻防矩阵发布,阿里云助力企业容器化安全落地
|
容器 Kubernetes 知识图谱
K8s 学习者绝对不能错过的最全知识图谱(内含 56个知识点链接)
7月9日 19:00-21:30 阿里云开发者社区首场“Offer 5000”直播开启!15位团队技术大牛在线招人,更有《阿里云技术面试红宝书》助你拿下Offer!马上投递简历:https://developer.aliyun.com/special/offerday01
13771 0
|
1月前
|
人工智能 开发者
AI一人公司深度拆解:0员工管8500家公司,年入千万美金、估值18亿
本文是「OPC一人公司通关手册」第29篇,深度拆解硅谷一家0员工AI公司:创始人单人驱动,AI全自动建公司、运营、融资,平台托管8500+家付费公司,年化收入千万美元,估值18亿人民币。核心启示:AI接管执行,人专注判断——一人公司的天花板不在人力,而在决策力。(239字)
|
2月前
|
人工智能 缓存 文字识别
为什么我放弃了 RAG:一个工程标书 AI 系统的技术选型复盘
做技术标最耗时间的不是专业判断,是翻历史标书、换项目名、调章节顺序。我给这个场景做了个对话式的编制系统并开源,但在知识库这一层,我最后把整个向量库删掉了——这篇复盘聊聊为什么 RAG 对不上强结构文档。
342 0
|
3月前
|
JSON 安全 Java
Sa-Token v1.46.0 发布 🚀,来看看有没有令你心动的功能!
Sa-Token 是一款开源免费的轻量级 Java 权限认证框架,支持登录/权限认证、单点登录、OAuth2.0及微服务网关鉴权。v1.46.0 版本新增 Fory JSON、RestClient、独立 Redisson 等插件,修复多处安全漏洞与兼容性问题,全面提升安全性与扩展性。
Sa-Token v1.46.0 发布 🚀,来看看有没有令你心动的功能!
|
6月前
|
人工智能 Linux Docker
轻量AI接口网关一键部署|calciumion/new-api Windows/Linux Docker 部署全教程
推荐一款轻量高效的AI统一API服务镜像——calciumion/new-api,无需复杂配置,依托Docker即可一键极速部署。本文完整讲解Windows、Linux全环境部署流程,全程复制命令就能操作,纯新手也能快速落地,看完直接上手私有AI接口网关搭建。
1964 5
轻量AI接口网关一键部署|calciumion/new-api Windows/Linux Docker 部署全教程
|
11月前
|
存储
初始化Map大小并非用多少指定多少
初始化HashMap时,指定容量并非直接生效,而是会调整为最近的2的幂次(如1变2,7变8)。为避免扩容开销,建议使用Guava工具Maps.newHashMapWithExpectedSize(),或手动按公式:容量 = 预期元素数 / 0.75 + 1 设置。
|
11月前
|
运维 开发工具 git
生产环境缺陷管理
在大型团队中,多分支开发易导致bug修复遗漏,引发严重生产事故。我们基于go-git打造通用工具git-poison,实现跨分支bug追溯与自动化管理,降低对人工沟通的依赖,提升协作效率与代码安全性,避免“重复踩坑”。