SQL インジェクション脆弱性プロセスの例と解決策

SQL インジェクション脆弱性プロセスの例と解決策

コード例:

パブリッククラスJDBCDemo3 {
  パブリック静的voiddemo3_1(){
    boolean flag = login("aaa' OR ' ","1651561"); //ユーザー名がわかっている場合は、このメソッドを使用して、パスワードを知らなくても正常にログインできます。if (flag) {
      System.out.println("ログインに成功しました");
    }それ以外{
      System.out.println("ログインに失敗しました");
    }

  }
  パブリック静的ブールログイン(文字列ユーザー名、文字列パスワード){
    接続 conn=null;
    ステートメント stat=null;
    結果セット rs=null;
    ブールフラグ=false;
    試す {
      接続 = JDBCUtils.getConnection();
      String sql="SELECT * FROM user WHERE username='"+username+"'AND password='"+password+"'"; //これが SQL インジェクション脆弱性の鍵です。これは文字列連結なので、クエリ ステートメントは SELECT * FROM user WHERE username='aaa' OR '' AND password='1651561' になります。このクエリ ステートメントは結果セットを取得できるため、この脆弱性が発生します。stat=conn.createStatement();
      rs = stat.executeQuery(sql);
      if(rs.next()){
        フラグ=true;
      }それ以外{
        フラグ=false;
      }
    } キャッチ (SQLException e) {
      e.printStackTrace();
    }
    フラグを返します。
  }

解決策: PrepareStatment を使用します。

パブリック静的voiddemo3_1(){
    ブールフラグ=login1("aaa' OR ' ","1651561");
    if (フラグ){
      System.out.println("ログインに成功しました");
    }それ以外{
      System.out.println("ログインに失敗しました");
    }

  }
  パブリック静的ブール値 login1(文字列ユーザー名、文字列パスワード){
    接続 conn=null;
    PreparedStatement pstat=null;
    結果セット rs=null;
    ブールフラグ=false;

    試す {
      接続 = JDBCUtils.getConnection();
      String sql="SELECT * FROM user WHERE username=? AND password=?"; //パラメータの代わりに?を使用します。事前設定されたSQL形式なので、SQLキーワードを入力してもSQLはそれを認識しません。pstat=conn.prepareStatement(sql);
      pstat.setString(1,username); //疑問符の値を設定します。pstat.setString(2,password);
      rs = pstat.executeQuery();
      if(rs.next()){
        フラグ=true;
      }それ以外{
        フラグ=false;
      }
    } キャッチ (SQLException e) {
      e.printStackTrace();
    }
    フラグを返します。
  }
}

上記の解決策を使用すると、SQL インジェクションの脆弱性を介してユーザーを正常にログインさせることは不可能になります。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • PHP で SQL インジェクションを防ぐための最善のソリューション
  • PHP 開発における一般的なセキュリティ問題 (SQL インジェクション、CSRF、Xss、CC など) の詳細な説明と解決策。
  • T-SQL: SQLインジェクションを防ぐ方法
  • ASP+MSSQL2000 データベースのバッチインジェクションのソリューション
  • MySQL プロキシ (インジェクションを解決する別の方法)
  • MySQL での SQL インジェクションを解決するための代替方法の詳細な説明
  • SQL インジェクションの原則とソリューションコードの例
  • ibatis で SQL インジェクション問題を解決する
  • SQL Server データベース インジェクション ソリューション
  • SQL インジェクションとその解決方法

<<:  Ubuntu 20.04 に Python 3 仮想環境をインストールする詳細なチュートリアル

>>:  Vueはファイルのアップロードとダウンロードを実装します

推薦する

EasyUEFI を使用して Windows 10 で USB ドライブなしで Ubuntu 18 をインストールする

1. BIOSを確認するまず、コンピュータの起動モードを確認します。win+R と入力し、msinf...

jQueryはシャトルボックス機能を実現する

この記事では、シャトルボックス機能を実現するためのjQueryの具体的なコードを参考までに紹介します...

Vue で親コンポーネントから子コンポーネントにデータを渡すいくつかの方法

最近、Vue のソースコードを勉強していて、Vue で親コンポーネントと子コンポーネント間でデータを...

複数のフィールドを変更するためのMysql更新の構文の詳細な分析

MySQL でレコードを更新すると、構文は正しいのですが、レコードが更新されません...質問文実行前...

Vue での keepAlive の使用例の詳細な説明

開発においては、一覧から詳細ページにジャンプし、また詳細ページに戻る際に一覧ページの状態(スクロール...

Tomcat での jar のロードに関する異常な問題の分析と解決

現象の説明:プロジェクトでは、Springboot を使用して Web プロジェクトを開始します。起...

MySQL で重複時間を削除して時間差を計算する実装

目次必要:ドライブ:アイデア:成し遂げる:個人的には、実際の開発ではストアド プロシージャの使用はお...

良いリファクタリングを行うには、コードをリファクタリングするだけでなく、人生をリファクタリングすることも重要です。

職業的な観点からも、人生の観点からも、良い再建をすることは本当に簡単ではありません。楽観的で熱心で前...

Webフロントエンドベクターアイコンの使い方

序文フロントエンドページを書くとき、小さなアイコンなどの画像を使うことが多いです。画像を使うとコード...

2 級コンピュータ試験のための MySQL の知識ポイントとよく使用される MYSQL コマンド

2級コンピュータ試験のMySQL知識ポイントの基礎、一般的なMYSQLコマンドは次のとおりです。よく...

Dockerイメージのインポートとエクスポートの実装

GitLabのDocker使用法gitlab ドッカー起動コマンド docker run -d -p...

MySQL のデータベース パフォーマンスに影響を与える要因の説明

データベースのパフォーマンスに関する話面接では、「データベースにどのくらい精通していますか?」など、...

Navicat で MySQL データベースのパスワードを変更する複数の方法

方法1: SET PASSWORDコマンドを使用するまずMySQLにログインします。フォーマット: ...

MySQL 5.7.17 zip インストールおよび設定チュートリアル MySQL 起動失敗の解決策

MySQL 5.7.17、現在最新バージョンのようです、ダウンロードアドレスここで、プラットフォーム...

ウェブカラーのコントラストと調和のテクニックの共有

色のコントラストと調和対照的な状況では、色の相互作用は単一の色によって与えられる感覚とは異なります。...