强化 SQL 语句

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: 应结合参数化查询、预编译语句等技术防止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”。每条信息都可以帮助攻击者制作他们的应用程序输入,这增加了他们成功的几率。

相关文章
|
8小时前
|
SQL 安全 JavaScript
黑名单和白名单
应用内防御SQL注入主要有黑名单和白名单两种输入验证方法。黑名单过滤已知恶意字符,易实现但防护有限;白名单仅允许预定义的合法字符,更安全有效。应根据输入类型定制规则,并结合警报机制应对异常输入,确保及时发现潜在攻击或误判。客户端验证可提升体验,但不可依赖,服务端验证必不可少。
|
8小时前
|
SQL 存储 安全
盲注和二阶 SQL 注入
SQL盲注通过延迟响应等间接方式探测数据库漏洞,获取敏感信息或篡改数据。攻击者利用sleep()函数或耗时操作判断语句执行情况。二阶SQL注入则利用存储后二次执行的数据,隐蔽性强,需结合参数化查询与输入验证防范。
|
8小时前
|
SQL 数据库 数据安全/隐私保护
用于绕过身份验证的 SQL 注入示例
该文介绍了SQL注入如何绕过登录验证:攻击者通过在登录表单输入恶意构造的用户名(如`admin')--`)和密码,利用SQL语句注释符`--`使数据库忽略密码校验,从而非法获取管理员权限。此攻击无需知晓真实密码,凸显了输入验证的重要性。
|
8小时前
|
SQL 存储 Oracle
成功的 SQL 注入攻击的后果
SQL注入可导致多种安全威胁:绕过身份验证、窃取敏感信息、篡改或删除数据、破坏网页内容,甚至执行远程系统命令。利用如xp_cmdshell等存储过程,攻击者可控制数据库服务器,造成严重危害。
|
8小时前
|
SQL 安全 数据库
SQL注入解释
SQL注入是攻击者通过恶意输入篡改数据库查询的攻击方式,因输入验证不足或SQL语句拼接不当导致。其危害巨大,OWASP将其列为Web应用头号安全威胁,需通过参数化查询等措施防范。
|
8小时前
|
SQL Oracle 安全
了解SQL注入
SQL是用于管理数据库的语言,广泛应用于各类Web应用后端。由于用户输入常被用于动态构建SQL语句,若未妥善过滤,攻击者可利用SQL注入插入恶意代码,导致身份绕过、数据泄露或传播恶意内容,危害严重。
|
8小时前
|
安全 小程序 JavaScript
OAuth2.0四种授权模式
OAuth2四种授权模式简介:授权码模式最安全,适用于第三方登录;简化模式适用于无后端的应用;密码模式需高度信任;客户端模式用于服务间调用,无需用户参与。
|
17小时前
|
存储
初始化Map大小并非用多少指定多少
初始化HashMap时,指定容量并非直接生效,而是会调整为最近的2的幂次(如1变2,7变8)。为避免扩容开销,建议使用Guava工具Maps.newHashMapWithExpectedSize(),或手动按公式:容量 = 预期元素数 / 0.75 + 1 设置。
|
11小时前
|
开发框架 微服务
应用架构图
在业务架构基础上,技术架构承接应用需求,明确技术选型与分层设计。涵盖开发语言、框架、微服务分层及非功能性需求,通过关键技术选型与层级关系梳理,形成完整的技术架构图,实现产品需求到技术落地的转化。(238字)
|
9小时前
|
消息中间件 Dubbo Java
SpringCloud诞生
微服务技术繁多,各司其职却缺乏统一方案。Dubbo、Nacos、Redis等组件需自行整合,架构复杂。Spring团队推出Spring Cloud,提供一站式解决方案,实现服务发现、配置管理、负载均衡等功能,简化微服务架构设计与开发。