SQL注入(SQL Injection)是一种网络安全漏洞,允许攻击者在应用程序的SQL查询中插入恶意代码。这种攻击通常发生在应用程序没有正确验证或清理用户输入数据的情况下,导致攻击者能够操纵数据库查询,获取、修改或删除敏感信息。(通过一些特殊的符号让原本的sql失效,让sql执行新的sql指令)
防止sql注入:
使用预编译的语句(Prepared Statements):如使用?占位符,并通过编程语言的库绑定参数。
使用存储过程(Stored Procedures):将SQL代码预先存储在数据库中,并通过参数调用。
验证和清理用户输入:确保用户输入不包含恶意字符或SQL关键字。
使用ORM(Object-Relational Mapping)工具:许多ORM工具会自动处理SQL构建,减少注入风险。
Scanner input=new Scanner(System.in);
Class.forName("com.mysql.cj.jdbc.Driver");
String url="jdbc:mysql://localhost:3306/example?serverTimezone=GMT&useSSL=false";
String user="root";
String pwd="password";
Connection conn=DriverManager.getConnection(url,user,pwd);
Statement statm=conn.createStatement();
System.out.println("请输入用户名");
String username=input.nextLine();
System.out.println("请输入用户名密码");
String userpwd=input.nextLine();
//jdbc操作数据库的index都是从1开始
//PreparedStatement 防止sql注入
//1.预处理sql语句
String sql="select * from login where lname=? and lpwd=?";
PreparedStatement prepareStatement=conn.prepareStatement(sql);
//2.?变成真正的参数
prepareStatement.setObject(1, username);
prepareStatement.setObject(2, userpwd);
//3.执行
ResultSet rs=prepareStatement.executeQuery();
if(rs.next()) {
int lid=rs.getInt("lid");
String lname=rs.getString("lrname");
String lsex=rs.getString("lsex");
String laddr=rs.getString("laddr");
System.out.println(lid+lname+lsex+laddr);
}else {
System.out.println("登陆失败");
}
rs.close();
conn.close();
statm.close();