文章目录
- sql注入准备
- 1.创建应该新的数据库用于测试;
- 2.修改配置
- 3.启动jar包
- 4.打开网页测试
- 5.测试sql注入
- sql注入避免
- 1. java中的登录逻辑代码
- 2.演示sql注入
- 3.原因
- 5.参数化查询-PreparedStatement
SQL注入是什么?
SQL 注入(SQL Injection)是一种常见的网络攻击技术,它利用应用程序没有正确过滤用户输入的数据,将恶意的 SQL 代码注入到应用程序中执行,从而导致应用程序的安全性受到威胁。
- 通简单来说,就是通过构造恶意的 SQL 语句,将恶意代码注入到应用程序中执行,从而实现各种攻击手段。
如何避免SQL注入?
应用程序需要对用户输入的数据进行正确的验证和过滤!
方法:
- 使用参数化查询:应用程序应该使用参数化查询来执行 SQL 语句,而不是拼接字符串的方式。参数化查询可以将用户输入的数据视为参数,而不是 SQL 语句的一部分,从而避免 SQL 注入攻击。在 Java 中,可以使用 PreparedStatement 类来执行参数化查询。
- 过滤用户输入:应用程序可以对用户输入的数据进行过滤和验证,例如检查用户输入是否符合预期格式、是否包含特殊字符等。
- 最小化权限:应用程序应该尽可能地限制数据库用户的权限,避免恶意用户通过注入恶意代码获取高权限访问数据库。
- 定期更新:应用程序应该定期更新依赖的库和组件,以及操作系统和数据库等基础设施,避免被已知的漏洞攻击。
案例来源:黑马程序员
sql注入准备
来源:黑马程序员
1.创建应该新的数据库用于测试;
mysql> create database test_sqlInject;
Query OK, 1 row affected (0.00 sec)
2.修改配置
3.启动jar包
sift+右键(打开powerShell)
运行代码
4.打开网页测试
查看原始的数据表
5.测试sql注入
sql注入避免
1. java中的登录逻辑代码
package src.com.itheima.jdbc;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;public class SqlUserLogin {public static void main(String[] args) throws Exception {//1.注册驱动Class.forName("com.mysql.jdbc.Driver");//2.获取连接Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test", "root", "123456");//接受用户输入的用户名和密码String name = "zhangsan";String pwd = "123";//编写sql语句String sql = "SELECT * FROM user where username='"+name+"' AND password = '"+pwd+"' ";//执行sqlStatement stat = conn.createStatement();ResultSet rs = stat.executeQuery(sql);//判断登录是否成功if(rs.next()){System.out.println("登录成功");}else {System.out.println("登录失败");}//释放资源rs.close();stat.close();conn.close();}
}
输入正确的用户名和密码=登录成功
错误则失败
2.演示sql注入
3.原因
通过一段字符串(伪造的sql代码)与真的代码进行拼接使整个 SQL语句的条件判断永远为真,从而绕过了应用程序的身份验证机制,获取了用户的数据。
-概括:拼字符串导致分不清参数和执行的关键字!!!
5.参数化查询-PreparedStatement
PreparedStatement接口
- PreparedStatement 接口可以用于执行预编译的 SQL语句,并支持参数化查询,可以有效防止 SQL 注入攻击,提高数据库操作的性能和安全性。
使用步骤:
- 获取preparedStatement对象
- 设置参数值
- 执行sql
package src.com.itheima.jdbc;import java.sql.*;
import java.util.ArrayList;public class SqlUserLogin {public static void main(String[] args) throws Exception {//1.注册驱动Class.forName("com.mysql.jdbc.Driver");//2.获取连接Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test", "root", "123456");//接受用户输入的用户名和密码String name = "bundc";String pwd = "' or '1'='1 ";//编写sql语句String sql = "SELECT * FROM user where username= ? AND password = ? ";//获取prepareStatementPreparedStatement ppst = conn.prepareStatement(sql);//设置展位符?的值ppst.setString(1,name);ppst.setString(2,pwd);//执行sqlResultSet rs = ppst.executeQuery();//判断登录是否成功if(rs.next()){System.out.println("登录成功");}else {System.out.println("登录失败");}//释放资源rs.close();ppst.close();conn.close();}
}