当前位置:   article > 正文

解决sql漏洞_sql注入漏洞解决方法

sql注入漏洞解决方法

反射封装

sql语句由字符串拼接而成时,当条件后面加上 or true,就会发生sql注入,如: username=“a’ or ‘1=1’ ”,这样就会使条件恒为true,为避免这样,可以使用statement的子类preparedStatement

preparedStatement的作用

  • 提前传入sql,执行的时候,不传入sql
  • 解决sql注入漏洞
  • 支持转入sql中的参数
  • 提高效率

Object…params(可变形参数组)

作用:再调用函数时,可以传入任意个任意类型的参数

  • Object…params必须将它放到函数最后,否则将出现错误,原因是数组将其他参数化为了自己的,而其他参数将无值

    查询多行多列

  1. public static <T> ArrayList<T> list(String sql, Class<T> c,Object...params) {
  2. ArrayList<T> list = new ArrayList<T>();
  3. try {
  4. //注册驱动-反射去加载jar包中com.mysql。jdbcDriver这个类的DriverManager.registerDriver()
  5. Class.forName("com.mysql.jdbc.Driver");
  6. //获取连接对象
  7. Connection con= DriverManager.getConnection("jdbc:mysql://localhost:3307/camp-2023?characterEncoding=utf8","root","root");
  8. System.out.println(con);
  9. //需要创建statement
  10. PreparedStatement preparedStatement = con.prepareStatement(sql);
  11. for (int i = 0; i < params.length; i++) {
  12. preparedStatement.setObject(i+1,params[i]);
  13. }
  14. //statement执行sql,返回结果集
  15. ResultSet rs = preparedStatement.executeQuery();
  16. //结果集rs得到结果集元数据
  17. ResultSetMetaData md = rs.getMetaData();
  18. //获取结果集的总列数
  19. int columnCount = md.getColumnCount();
  20. //解析
  21. while(rs.next()) {//读取结果集的光标向下移动一行,光标默认在哪一行,列名所在的哪一行
  22. //根据每一行数据,封装成一个实体对象
  23. T t=c.newInstance();
  24. //取出某一行的每一列数据,封装到对象t的属性中
  25. for (int i = 1; i <columnCount ; i++) {
  26. //通过列的序号,获取每一列的值
  27. Object value= rs.getObject(i);
  28. if(value !=null) {
  29. //通过列的序号,获取每一列的名
  30. String columnName = md.getColumnName(i);
  31. //因为列名和实体类t中的属性名一致,为每一个属性构造一个反射中的set方法
  32. Field f = c.getDeclaredField(columnName);
  33. //赋予私有属性的赋值权限
  34. f.setAccessible(true);
  35. //使用反射,把value给到对象t的属性中
  36. f.set(t, value);//理解为:把value赋值给对象的columName属性,相当于set方法
  37. }
  38. }
  39. list.add(t);
  40. }
  41. //关闭资源
  42. preparedStatement.close();
  43. con.close();
  44. }catch (Exception e){
  45. e.printStackTrace();
  46. }
  47. return list;
  48. }

查询一行

  1. public static <T> T selectRow(String sql, Class<T> c,Object...params) {
  2. try {
  3. //注册驱动-反射去加载jar包中com.mysql。jdbcDriver这个类的DriverManager.registerDriver()
  4. Class.forName("com.mysql.jdbc.Driver");
  5. //获取连接对象
  6. Connection con= DriverManager.getConnection("jdbc:mysql://localhost:3307/camp-2023?characterEncoding=utf8","root","root");
  7. System.out.println(con);
  8. //需要创建statement
  9. PreparedStatement preparedStatement = con.prepareStatement(sql);
  10. for (int i = 0; i < params.length; i++) {
  11. preparedStatement.setObject(i+1,params[i]);
  12. }
  13. //statement执行sql,返回结果集
  14. ResultSet rs = preparedStatement.executeQuery();
  15. //结果集rs得到结果集元数据
  16. ResultSetMetaData md = rs.getMetaData();
  17. //获取结果集的总列数
  18. int columnCount = md.getColumnCount();
  19. T t=null;
  20. //解析
  21. if (rs.next()) {//读取结果集的光标向下移动一行,光标默认在哪一行,列名所在的哪一行
  22. //根据每一行数据,封装成一个实体对象
  23. t=c.newInstance();
  24. //取出某一行的每一列数据,封装到对象t的属性中
  25. for (int i = 1; i < columnCount; i++) {
  26. //通过列的序号,获取每一列的值
  27. Object value = rs.getObject(i);
  28. if (value != null) {
  29. //通过列的序号,获取每一列的名
  30. String columnName = md.getColumnName(i);
  31. //因为列名和实体类t中的属性名一致,为每一个属性构造一个反射中的set方法
  32. Field f = c.getDeclaredField(columnName);
  33. //赋予私有属性的赋值权限
  34. f.setAccessible(true);
  35. //使用反射,把value给到对象t的属性中
  36. f.set(t, value);//理解为:把value赋值给对象的columName属性,相当于set方法
  37. }
  38. }
  39. }
  40. //关闭资源
  41. preparedStatement.close();
  42. con.close();
  43. return t;
  44. }catch (Exception e){
  45. e.printStackTrace();
  46. }
  47. return null;
  48. }

查询一列

  1. public static <T> ArrayList<T> selectColumn(String sql, Class<T> c,Object...params) {
  2. ArrayList<T> list = new ArrayList<T>();
  3. try {
  4. //注册驱动-反射去加载jar包中com.mysql。jdbcDriver这个类的DriverManager.registerDriver()
  5. Class.forName("com.mysql.jdbc.Driver");
  6. //获取连接对象
  7. Connection con= DriverManager.getConnection("jdbc:mysql://localhost:3307/camp-2023?characterEncoding=utf8","root","root");
  8. System.out.println(con);
  9. //需要创建statement
  10. PreparedStatement preparedStatement = con.prepareStatement(sql);
  11. for (int i = 0; i < params.length; i++) {
  12. preparedStatement.setObject(i+1,params[i]);
  13. }
  14. //statement执行sql,返回结果集
  15. ResultSet rs = preparedStatement.executeQuery();
  16. //结果集rs得到结果集元数据
  17. ResultSetMetaData md = rs.getMetaData();
  18. //获取结果集的总列数
  19. int columnCount = md.getColumnCount();
  20. //解析
  21. while (rs.next()) {//读取结果集的光标向下移动一行,光标默认在哪一行,列名所在的哪一行
  22. //取出某一行的每一列数据,封装到对象t的属性中
  23. //通过列的序号,获取每一列的值
  24. T t=(T) rs.getObject(1);
  25. list.add(t);
  26. }
  27. //关闭资源
  28. preparedStatement.close();
  29. con.close();
  30. }catch (Exception e){
  31. e.printStackTrace();
  32. }
  33. return list;
  34. }

查询单个

  1. public static <T> T selectOne(String sql, Class<T> c,Object...params) {
  2. try {
  3. //注册驱动-反射去加载jar包中com.mysql。jdbcDriver这个类的DriverManager.registerDriver()
  4. Class.forName("com.mysql.jdbc.Driver");
  5. //获取连接对象
  6. Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3307/camp-2023?characterEncoding=utf8", "root", "root");
  7. System.out.println(con);
  8. //需要创建statement
  9. PreparedStatement preparedStatement= con.prepareStatement(sql);
  10. for (int i = 0; i < params.length; i++) {
  11. preparedStatement.setObject(i+1,params[i]);
  12. }
  13. //statement执行sql,返回结果集
  14. ResultSet rs = preparedStatement.executeQuery();
  15. //结果集rs得到结果集元数据
  16. ResultSetMetaData md = rs.getMetaData();
  17. //获取结果集的总列数
  18. int columnCount = md.getColumnCount();
  19. //解析
  20. T t =null;
  21. if (rs.next()){
  22. t= (T)rs.getObject(1);
  23. }
  24. //通过列的序号,获取每一列的值
  25. //关闭资源
  26. preparedStatement.close();
  27. con.close();
  28. return t;
  29. }catch (Exception e){
  30. e.printStackTrace();
  31. }
  32. return null;
  33. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/596229
推荐阅读
相关标签
  

闽ICP备14008679号