mysqlステートメントのインジェクションエラーとは何ですか?

青灯夜游
リリース: 2020-10-20 14:18:57
オリジナル
2355 人が閲覧しました

mysql ステートメントの注入エラーは、一部のデータベースの外部インターフェイスを使用してユーザー データを実際の SQL 言語に挿入し、それによってデータベース、さらにはオペレーティング システムに侵入するという目的を達成することです。攻撃者はこれを使用して、データベース内のデータの読み取り、変更、削除、データベース内のユーザー情報、パスワード、その他の情報の取得、さらには管理者権限の取得を行います。

mysqlステートメントのインジェクションエラーとは何ですか?

#(推奨チュートリアル:

mysql ビデオ チュートリアル)

SQL インジェクション エラー(SQL インジェクション)

SQL インジェクションとは、特定のデータベースの外部インターフェイスを使用してユーザー データを実際のデータベース オペレーティング言語 (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' または'1 = 1、パスワードは 151515 です。データベースから、そのようなユーザーが存在しないことがわかります。ログイン失敗が表示されるはずですが、または '1 = 1 が no であるため、結果はログインに成功しました。これで、ユーザー名の内容が SQL ステートメントの内容になり、何があっても結果は true となり、パスワードを入力せずにログインできることになります。ここでセキュリティの問題が発生します。
mysqlステートメントのインジェクションエラーとは何ですか?解決策

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. 検証用に独自の関数を定義します


データが有効になるように整理します

    既知の不正な入力を拒否します
  • Only既知の法的入力を受け入れる
  • したがって、最高のセキュリティ ステータスを取得したい場合、現時点での最善の解決策は、ユーザーが送信したデータ、または変更される可能性のあるデータを単純に分類することです。正規表現は次のとおりです。ユーザーが提供した入力データを厳密に検出および検証するためにそれぞれ適用されます。
実際には、既知の形式の攻撃を防ぐには、不正なシンボルの組み合わせをフィルタリングするだけで済みます。新しい攻撃シンボルの組み合わせが発見された場合は、これらのシンボルの組み合わせを追加して、新たな攻撃を継続的に防ぐこともできます。特に、スペース記号とキーワードを区切る記号 (/**/ など) は同じ効果を持ちます。この記号が正常にフィルタリングできれば、多くのインジェクション攻撃は発生しなくなります。 16 進表現は「%XX」です。

以上がmysqlステートメントのインジェクションエラーとは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート