mysql sql注入漏洞修复_从Java角度修复SQL注入漏洞

本文介绍了如何通过使用预编译语句避免SQL注入漏洞,以用户登录测试为例,展示了从普通查询到预编译PreparedStatement的转变。强调了在开发中养成良好习惯的重要性,以提升代码安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

很多情况因为过滤不严导致很多网站存在sql注入,这里以用户登陆为例,简单举例

首先创建一个测试的数据库

比较基础,不写创建过程了

5646f154da3dbdc384b9bc93b78e403f.png

java代码如下:

packagecn.basic.jdbc;importjava.awt.image.RescaleOp;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.sql.Statement;importorg.junit.jupiter.api.Test;public classTest1 {/** public static void main(String[] args) throws ClassNotFoundException,

* SQLException { login("aa","aa"); }*/@Testpublic void testlogin() throwsClassNotFoundException, SQLException {

login("aa", "aa");

}public static void login(String username, String password) throwsSQLException, ClassNotFoundException {

Class.forName("com.mysql.jdbc.Driver");

Connection conn= DriverManager.getConnection("jdbc:mysql://127.0.0.1/test", "root", "root");

Statement st=conn.createStatement();

String sql= "select * from xxx where username=" + "'" + username + "'" + "and password=" + "'" +password+ "'";

ResultSet rs=st.executeQuery(sql);if(rs.next()) {

System.out.println("恭喜" + username + "登陆成功");

System.out.println(sql);

}else{

System.out.println("登录失败");

}if (rs != null) {

rs.close();

}/** if (st != null) { st.close(); }*/

if (conn != null) {

conn.close();

}

}

}

运行

7a33b93ea7296a9a1de43d92c085330a.png

输入正确账号密码可以登陆成功。这里可以被绕过。

3dacdeb313d094c69f8e809518e7fb62.png

很显然这是万能密码。那么如何去修复sql注入呢,这里比较好的方法是采用预编译的开发方式,这是个开发习惯问题。

修复后的预编译代码如下:

packagecn.basic.jdbc;importjava.awt.image.RescaleOp;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.sql.Statement;importorg.junit.jupiter.api.Test;public classTest1 {/** public static void main(String[] args) throws ClassNotFoundException,

* SQLException { login("aa","aa"); }*/@Testpublic void testlogin() throwsClassNotFoundException, SQLException {

login("aa", "aa");

}public static void login(String username, String password) throwsSQLException, ClassNotFoundException {

Class.forName("com.mysql.jdbc.Driver");

Connection conn= DriverManager.getConnection("jdbc:mysql://127.0.0.1/test", "root", "root");

String sql="select * from xxx where username=? and password=?";//使用预编译

PreparedStatement ps =conn.prepareStatement(sql);

ps.setString(1, username);

ps.setString(2, password);

ResultSet rs=ps.executeQuery();if(rs.next()) {

System.out.println("恭喜" + username + "登陆成功");

System.out.println(sql);

}else{

System.out.println("登录失败");

}if (rs != null) {

rs.close();

}if(ps!=null) {

ps.close();

}/** if (st != null) { st.close(); }*/

if (conn != null) {

conn.close();

}

}

}

再来测试下是否存在安全漏洞:

输入正确密码:

117f13a83ebed64fa01e583839dd0379.png

尝试万能密码绕过:

9c6066aa3b8fe8bc5ef8fde4ab2dad7c.png

这里杜绝了sql注入的产生,在很多时候,要养成用预编译编方式实现增删改查,这里以查询为例子,增删改同理!

预编译并不代表百分百防止sql注入的,这只是一种防止sql注入的措施。

不忘初心,方得始终。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值