sql注入问题
sql存在漏洞,会导致数据泄露
web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾加上额外的sql语句,实现非法操作
SQL会被拼接
packagecom.kuang.lesson02;
importcom.kuang.lesson02.utils.JdbcUtils;
importjava.sql.Connection;
importjava.sql.ResultSet;
importjava.sql.Statement;
publicclassSQL注入 {
publicstaticvoidmain(String[] args) {
// login("zhangsan","123456"); // 正常登陆
login(" 'or '1=1","123456"); // SQL 注入
// `name` = ''
}
publicstaticvoidlogin(Stringusername,Stringpassword){
Connectionconn=null;
Statementst=null;
ResultSetrs=null;
try{
conn=JdbcUtils.getConnection();
// select * from users where name='' or '1=1' and password =
'123456'
Stringsql="select * from users where name='"+username+"' and
password='"+password+"'";
st=conn.createStatement();
rs=st.executeQuery(sql);
while(rs.next()){
System.out.println(rs.getString("name"));
System.out.println(rs.getString("password"));
System.out.println("==============");
}
}catch (Exceptione) {
e.printStackTrace();
}finally{
JdbcUtils.release(conn, st, rs);
}
}
}
prepareStatement
- 是Statement的子类
- 可以避免sql注入的问题
- 通过Connection.preparedStatement()方法获得
- 可以对sql进行预编译,从而提高数据库的执行效率
- 允许使用占位符替换sql语句中的参数
1.插入数据
packagecom.kuang.lesson03;
importcom.kuang.lesson02.utils.JdbcUtils;
importjava.sql.Connection;
importjava.util.Date;
importjava.sql.PreparedStatement;
importjava.sql.ResultSet;
publicclassTestInsert {
publicstaticvoidmain(String[] args) {
Connectionconn=null;
PreparedStatementst=null;
ResultSetrs=null;
try{
//获取一个数据库连接
conn=JdbcUtils.getConnection();
//要执行的SQL命令,SQL中的参数使用?作为占位符
Stringsql="insert into users(id,name,password,email,birthday)
values(?,?,?,?,?)";
//通过conn对象获取负责执行SQL命令的prepareStatement对象
st=conn.prepareStatement(sql);
//为SQL语句中的参数赋值,注意,索引是从1开始的
st.setInt(1, 4);//id是int类型的
st.setString(2, "kuangshen");//name是varchar(字符串类型)
st.setString(3, "123");//password是varchar(字符串类型)
st.setString(4, "24736743@qq.com");//email是varchar(字符串类型)
st.setDate(5, newjava.sql.Date(new
Date().getTime()));//birthday是date类型
//执行插入操作,executeUpdate方法返回成功的条数
intnum=st.executeUpdate();
if(num>0){
System.out.println("插入成功!!");
}
}catch (Exceptione) {
e.printStackTrace();
}finally{
//SQL执行完成之后释放相关资源
JdbcUtils.release(conn, st, rs);
}
}
}