private boolean validate(String userName,String userPass)
{
try
{
Class.forName(driver);
conn = DriverManager.getCOnnection(urlmuser,pass);
pstmt = conn.prepareStatement("select * from jdbc_test" + "where jdbc_name=? add jdbc_desc=?"); pstmt.setString(1,userName);
pstmt.setString(2,userPass);
if(pstmt.executeQuery().next())
{
return true;
}
catch(Exception e)
{
r.printStackTrace();
}
finally
{
try
{
if(rs != null)
{
rs.close();
}
if(pstmt != null)
{
pstmt.close();
}
if(conn != null)
{
conn.close();
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
return false;
}
}这是 疯狂java讲义里面的 第650面问题一:请问为什么用prepareStatement这样写就能避免SQL注入?

解决方案 »

  1.   

    所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,prepareStatement方法会对sql语句进行预处理,sql语句传入的参数如果带有特殊符号,比如单引号“'”,就会被prepareStatement直接处理掉,等等
      

  2.   

    等于?是JAVA内部传变量进入  加入你SQL这样写 select * from user where name=‘"+name+“’”,其中name是你输入的用户名,别人只要把name输入成abc' or '1'='1 那么你的sql语句就会变成 select * from user where name='abc or '1'='1' 那这个SQL不管你输入什么都会是正确的,这就是基本的注入攻击