(推荐教程:mysql视频教程)
sql注入式错误(SQL injection)
危害
攻击者利用它来读取、修改或者删除数据库内的数据,获得数据库中用户资料和密码等信息,更严重的就是获得管理员的权限。
例子
//注入式错误 public static void test3(String name,String passward){ Connection connection = null; Statement st = null; ResultSet rs = null; try { // 加载JDBC 驱动 Class.forName("com.mysql.jdbc.Driver"); // 获得JDBC 连接 String url = "jdbc:mysql://localhost:3306/tulun"; connection = DriverManager.getConnection(url,"root","123456"); //创建一个查询语句 st = connection.createStatement(); //sql语句 String sql = "select * from student where name = '"+ name+"' and passward = '"+passward+"'"; rs = st.executeQuery(sql); if(rs.next()){ System.out.println("登录成功。"); }else{ System.out.println("登录失败。"); } } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { test3("wjm3' or '1 = 1","151515"); }
登录后复制
数据库信息
如上面的代码所示,用户名为wjm3’ or '1 = 1,密码为151515,从数据库中可以看出我们没有这样的用户,本来应该显示登录失败,但是结果却是登陆成功,因为or '1 = 1 已经不是用户名里面的内容了,它现在为SQL 语句里面的内容,不论如何,结果都为true,等于不用输密码都可以登录。这里就产生了安全问题。
解决方法
1. PrepareStatement
//注入式错误 public static void test3(String name,String passward){ Connection connection = null; PreparedStatement st = null; ResultSet rs = null; try { // 加载JDBC 驱动 Class.forName("com.mysql.jdbc.Driver"); // 获得JDBC 连接 String url = "jdbc:mysql://localhost:3306/tulun"; connection = DriverManager.getConnection(url,"root","123456"); //创建一个查询语句 String sql1 = "select * from student where name = ? and passward = ?"; st = connection.prepareStatement(sql1); st.setString(1,name); st.setString(2,passward); //sql语句 //String sql = "select * from student where name = '"+ name+"' and passward = '"+passward+"'"; rs = st.executeQuery(); if(rs.next()){ System.out.println("登录成功。"); }else{ System.out.println("登录失败。"); } } catch (Exception e) { e.printStackTrace(); }finally{ try { connection.close(); st.close(); rs.close(); } catch (SQLException e) { e.printStackTrace(); } } } public static void main(String[] args) { test3("wjm3' or '1 = 1","151515"); }
登录后复制
上面这个代码不管name 参数是什么,它都只是name 参数,不会作为sql语句的一部分来执行,一般来说推荐这个方法,比较安全。
2.自己定义函数进行校验
- 整理数据使之变得有效
- 拒绝已知的非法输入
- 只接受已知的合法输入
以上就是mysql语句的注入错误是什么?的详细内容,更多请关注Work网其它相关文章!