mysql语句的注入错误是什么?

互联网 20-10-20

mysql语句的注入式错误就是利用某些数据库的外部接口将用户数据插入到实际的SQL语言当中,从而达到入侵数据库乃至操作系统的目的。攻击者利用它来读取、修改或者删除数据库内的数据,获得数据库中用户资料和密码等信息,更严重会获得管理员的权限。

(推荐教程: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语句的注入错误是什么?的详细内容,更多内容请关注技术你好其它相关文章!

来源链接:
免责声明:
1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险
2.本文版权归属原作所有,仅代表作者本人观点,不代表本站的观点或立场
标签: 注入式错误
上一篇:php获取远程图片并下载保存到本地的方法分析 下一篇:mysql中数据库怎么查看?

相关资讯