千家信息网

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

发表于:2025-02-23 作者:千家信息网编辑
千家信息网最后更新 2025年02月23日,小编给大家分享一下mysql语句的注入错误指的是什么,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!mysql语句的注入式错误就是利用某些数据库的外部接口将用户数据插入到实际的SQL语言当
千家信息网最后更新 2025年02月23日mysql语句的注入错误指的是什么

小编给大家分享一下mysql语句的注入错误指的是什么,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!

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

sql注入式错误(SQL injection)

SQL Injection 就是利用某些数据库的外部接口将用户数据插入到实际的数据库操作语言(SQL)当中,从而达到入侵数据库乃至操作系统的目的。它的产生主要是由于程序对用户输入的数据没有进行严格的过滤,导致非法数据库查询语句的执行。
《深入浅出 MySQL》

危害
攻击者利用它来读取、修改或者删除数据库内的数据,获得数据库中用户资料和密码等信息,更严重的就是获得管理员的权限。

例子

 //注入式错误    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.自己定义函数进行校验

  • 整理数据使之变得有效
  • 拒绝已知的非法输入
  • 只接受已知的合法输入

所以如果想要获得最好的安全状态,目前最好的解决办法就是对用户提交或者可能改变的数据进行简单分类,分别应用正则表达式来对用户提供的输入数据进行严格的检测和验证。
其实只需要过滤非法的符号组合就可以阻止已知形式的攻击,并且如果发现更新的攻击符号组合,也可以将这些符号组合增添进来,继续防范新的攻击。特别是空格符号和其产生相同作用的分隔关键字的符号,例如"/**/",如果能成功过滤这种符号,那么有很多注入攻击将不能发生,并且同时也要过滤它们的十六进制表示"%XX"。

看完了这篇文章,相信你对mysql语句的注入错误指的是什么有了一定的了解,想了解更多相关知识,欢迎关注行业资讯频道,感谢各位的阅读!

数据 数据库 语句 用户 错误 符号 攻击 登录 成功 密码 就是 输入 安全 信息 查询 组合 操作系统 代码 内容 参数 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 为什么要引入数据库 软考网络安全工程师时间 数据库 项目 步骤 数据库st 网络安全技能宣传普及简报 杭州官方软件开发哪个好 数据库跨域数据一致性 ruby软件开发工程师 软件开发今日反思 荣耀手机属于什么服务器 甘肃网络技术服务销售价格 两条宽带的dns服务器地址一样 网络技术在酒店中的运用案例 手机查车服务器没开启 王琼 网络安全 腾讯 数据库查询max能直接字段 美创科技网络安全产业链图谱 中国东盟网络安全协同创新联盟 东芝计算机软件开发 neo4j数据库是哪个公司 软件开发提供技术支持工作 供暖行业自动化控制软件开发 公司服务器文件打开速度慢怎么办 mdb 数据库修复 创建数据库的几种方法 如何写网络安全教育脚本 软件开发比较好的二本大学 中国东盟网络安全协同创新联盟 网络安全体系包括哪些 网络安全法全员答题答案
0