应用软件安全编程--01预防SQL注入

SQL 注入是一种数据库攻击手段。攻击者通过向应用程序提交恶意代码来改变原 SQL 语句的含义,进而执行任意SQL 命令,达到入侵数据库乃至操作系统的目的。防止 SQL 注入的主要方法有:净 化并验证非受信输入,采用参数化查询。

对于预防 SQL 注入的情况,示例1给出了不规范用法(Java 语言)示例。示例2给出了规范用法(Java 语言)示例。

java 复制代码
示例1:

public void doPrivilegedAction(String username,char[] password)

throws SQLException {

Connection connection = getConnection();

//.. .

try {

String  pwd  =  hashPassword(password);

String  sqlString  ="SELECT  *  FROM  db  user  WHERE  username  =""

+    username    +

"AND               password=""+pwd+"";

Statement       stmt       =       connection.createStatement();

ResultSetrs  =  stmt.executeQuery(sqlString);

//.. .

} finally {

try {

connection.close();

}catch(SQLException  x){

//.. .

}

}

}

在这个不规范的代码示例中,使用JDBC来认证用户,提交 stmt.executeQuery(sqlString) 查询的 SQL 为 sqlString,它是通过一个拼接字符串组合而来,并且 sqlString 未经过净化或验证,当 pwd 为OR1=1 时,sqlString 就会变成:SELECT FROM db user WHERE username ="AND password=" OR'1'='1。Statement.executeQuery(String)方法不能防止 SQL 注入,该代码将会引发SQL注入漏洞攻击。

java 复制代码
示例2:

public void doPrivilegedAction(String username,char[] password)

throws SQLException {

Connection connection = getConnection();

try {

String  pwd  =  hashPassword(password);

if  (username.length()>8){

//.

String  sqlString  =

"select  *  from  db  user where username=?  and password=?";

PreparedStatementstmt  =  connection.prepareStatement(sqlString);

stmt.setString(1,username);

stmt.setString(2,pwd);

//.

} finally {


try {

connection.close():

}catch(SQLException  x){

//.

 }

}

在这个规范的代码示例中,采用java.sql.PreparedStatement 执行参数化查询,可以避免含有注入 代码的 SQL 语句提交执行。通过使用prepareStatement类的 set*() 方法,可以进行强类型检查。程 序会正确的转义双引号内的输入数据,以减少SQL 注入漏洞。类似的,对数据的增删改操作也应使用 prepareStatement。

相关推荐
Yushan Bai14 小时前
ORACLE数据库在进行DROP TABLE时失败报错ORA-00604问题的分析处理
数据库·oracle
77美式14 小时前
Node + Express + MongoDB 后端部署全解析:新手零踩坑
数据库·mongodb·express
城数派14 小时前
2000-2025年我国省市县三级逐8天日间地表温度数据(Shp/Excel格式)
数据库·arcgis·信息可视化·数据分析·excel
小蒋聊技术14 小时前
电商系列第五课:支付中心——资金安全、幂等设计与 AI 风控大脑
人工智能·安全
AC赳赳老秦14 小时前
OpenClaw text-translate技能:多语言批量翻译,解决跨境工作沟通难题
大数据·运维·数据库·人工智能·python·deepseek·openclaw
AI应用实战 | RE14 小时前
014、索引高级实战:当单一向量库不够用的时候
数据库·人工智能·langchain
ffqws_14 小时前
Spring Boot入门:通过简单的注册功能串联Controller,Service,Mapper。(含有数据库建立,连接,及一些关键注解的讲解)
数据库·spring boot·后端
汤愈韬14 小时前
网络安全之网络基础知识_2
网络协议·安全·web安全
清水白石00815 小时前
《Python 架构师的自动化哲学:从基础语法到企业级作业调度系统与 Airflow 止损实战》
数据库·python·自动化
阿华田51215 小时前
MySQL性能优化大全
数据库·mysql·性能优化