JDBC-防止sql注入
SQL 注入是用户利用某些系统没有对输入数据进行充分的检查,从而进行恶意破坏的行为。
1、statement存在sql注入攻击问题,例如登陆用户名采用 name’ or ‘a’=’a
select * from student where sname='name' or 'a'='a';
可以查出所有信息
2、防范 SQL 注入,需要采用PreparedStatement取代Statement。
3、或者通过程序来控制,这个比较麻烦,推荐使用PrepareStatement来完成.
import java.io.*; import java.sql.*; public class TestInsert { public static void main(String[] args) { try { BufferedReader br = new BufferedReader(new InputStreamReader( System.in)); System.out.println("请输入学号:"); String sno = br.readLine(); System.out.println("请输入姓名:"); String sname = br.readLine(); System.out.println("请输入性别:"); String ssex = br.readLine(); System.out.println("请输入年龄:"); int sage = Integer.parseInt(br.readLine()); System.out.println("请输入专业:"); String sdept = br.readLine(); Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); Connection conn = DriverManager.getConnection( "jdbc:sqlserver://localhost:1433;database=mydb", "sa", "19891005a"); String sql = "insert into students (sno,sname,ssex,sage,sdept) values(?,?,?,?,?)"; // 采用预编译处理SQL语句(在获取PreparedStatement对象的时候加载SQL语句) PreparedStatement ps = conn.prepareStatement(sql); ps.setString(1, sno); ps.setString(2, sname); ps.setString(3, ssex); ps.setInt(4, sage); ps.setString(5, sdept); int n = ps.executeUpdate(); if (n > 0) { System.out.println("添加成功!"); } else { System.out.println("添加失败!"); } if (ps != null) { ps.close(); } if (conn != null) { conn.close(); } } catch (Exception e) { e.printStackTrace(); } } }