>  기사  >  데이터 베이스  >  mysql 문의 주입 오류는 무엇입니까?

mysql 문의 주입 오류는 무엇입니까?

青灯夜游
青灯夜游원래의
2020-10-20 14:18:572298검색

mysql 문의 주입 오류는 일부 데이터베이스의 외부 인터페이스를 사용하여 실제 SQL 언어에 사용자 데이터를 삽입함으로써 데이터베이스는 물론 운영체제까지 침입하려는 목적을 달성하는 것입니다. 공격자는 이를 사용하여 데이터베이스의 데이터를 읽거나 수정 또는 삭제하고, 데이터베이스의 사용자 정보, 비밀번호 및 기타 정보를 얻거나 더 심각하게는 관리자 권한을 얻습니다.

mysql 문의 주입 오류는 무엇입니까?

(추천 튜토리얼: mysql 동영상 튜토리얼)

sql 주입 오류(SQL 주입)

SQL 주입은 일부 데이터베이스의 외부 인터페이스를 사용하여 실제 데이터베이스 운영 언어에 사용자 데이터를 삽입하는 것입니다( SQL)을 통해 데이터베이스는 물론 운영체제까지 침입하려는 목적을 달성합니다. 이는 주로 프로그램이 사용자가 입력한 데이터를 엄격하게 필터링하지 않아 잘못된 데이터베이스 쿼리 문이 실행되기 때문에 발생합니다.
"간단히 말하면 MySQL"

Hazards
공격자는 이를 사용하여 데이터베이스의 데이터를 읽거나 수정하거나 삭제하고, 데이터베이스의 사용자 정보와 비밀번호를 얻고, 더 심각하게는 관리자 권한을 얻습니다.

Example

 //注入式错误
    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");

    }

데이터베이스 정보
mysql 문의 주입 오류는 무엇입니까?
위 코드에서 보듯이, 사용자 이름은 wjm3' 또는 '1=1이고, 비밀번호는 151515입니다. 우리가 하는 데이터베이스를 보면 알 수 있습니다. 원래는 로그인에 실패했다고 표시되어야 하지만 결과는 로그인에 성공했다는 것입니다. 왜냐하면 또는 '1 = 1은 더 이상 사용자 이름의 내용이 아니며 이제 SQL 문의 내용이기 때문입니다. . 어쨌든 결과는 true이므로 비밀번호를 입력할 필요가 없습니다. 여기서 보안 문제가 발생합니다.

Solution

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 매개변수일 뿐이며 일반적으로 이 방법을 권장합니다. 왜냐하면 그것이 더 안전하기 때문입니다.
2. 검증을 위한 자신만의 기능을 정의하세요

  • 데이터를 유효하게 정리하세요
  • 알려진 불법 입력을 거부하세요
  • 알려진 합법적인 입력만 받아들이세요

최상의 보안 상태를 얻으려면, 현재 가장 좋은 해결책은 사용자가 제출했거나 변경될 수 있는 데이터를 단순히 분류하고 정규식을 적용하여 사용자가 입력한 데이터를 엄격하게 탐지하고 검증하는 것입니다.
실제로 알려진 형태의 공격을 방지하려면 불법 기호 조합만 필터링하면 되며, 새로운 공격 기호 조합이 발견되면 이러한 기호 조합도 추가하여 새로운 공격을 지속적으로 방지할 수 있습니다. 특히 공백 기호와 키워드를 구분하는 기호는 "/**/"와 같이 동일한 효과를 갖습니다. 이 기호를 성공적으로 필터링할 수 있다면 많은 주입 공격이 발생하지 않을 것이며 동시에 이러한 공격도 반드시 발생해야 합니다. 16진수 표현은 "%XX"입니다.

위 내용은 mysql 문의 주입 오류는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.