SQL注入漏洞以及解决方案

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攻击;

提高代码可读性,和可维护性

提高效率

用于设置参数值的设置方法(setShortsetString 等等)必须指定与输入参数的已定义 SQL 类型兼容的类型

代码修改为:

打印效果:



以上就是关于SQL注入问题的解决过程。

猜你喜欢

转载自blog.csdn.net/csdn_fanya/article/details/80247988