1.原始正常逻辑下的代码:
package com.fanya;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class TestLogin
{
public static void login(String name,String password)
{
//加载JDBC驱动
try
{
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e)
{
System.out.println("加载JDBC驱动失败"+e.getMessage());
return;
}
Connection conn = null;
PreparedStatement rs = null;
ResultSet set = null;
try
{
conn = DriverManager.getConnection("jdbc:mysql://localhost/testdb1?"
+ "seUnicode=true&charactorEncoding=utf-8","root","root");
rs = conn.prepareStatement("select * from user" );
set = rs.executeQuery();
while(set.next())
{
String name1 = set.getString("name");
String password1 = set.getString("password");
System.out.println("name="+name1+",password="+password1);
}
} catch (SQLException e)
{
System.out.println("数据库连接失败"+e.getMessage());
}
finally
{
if(conn!=null)
{
try
{
conn.close();
} catch (SQLException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(rs!=null)
{
try
{
rs.close();
} catch (SQLException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(set!=null)
{
try
{
set.close();
} catch (SQLException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public static void main(String[] args)
{
login("fanya","123");
}
}
运行结果:
看着好像没有什么问题,但是:
解决方案:
防止SQL攻击:分布校验
分步校验:先使用用户名来查询用户,如果找到了,再比较密码。
PreparedStatement好处?
防止SQL攻击;
提高代码可读性,和可维护性
提高效率
用于设置参数值的设置方法(setShort
、setString
等等)必须指定与输入参数的已定义 SQL 类型兼容的类型
代码修改为:
打印效果:
以上就是关于SQL注入问题的解决过程。