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();
      }
   }
}