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はファイルのアップロードとダウンロードを実装します

推薦する

CentOS に Nginx をインストールする方法

公式ドキュメント: https://nginx.org/en/linux_packages.html...

WeChatアプレットを少なく使う方法(最適な方法)

序文私は less/sass を書くことに慣れていますが、小さなプログラムを開発するときには、まだ ...

VMware Workstation 15 Pro インストール ガイド (初心者向け)

01. VMware Workstation Pro 15 のダウンロードダウンロード: VMwa...

Linux Centos8 CA証明書作成チュートリアル

必要なファイルをインストールする Yum インストール openssl-* -yデータベースインデッ...

Vueライフサイクルの違いの詳細な説明

ライフサイクル分類vue の各コンポーネントは独立しており、各コンポーネントには独自のライフサイクル...

Access_Tokenの統合管理を実現するミニプログラム開発

目次TOKEN タイマーリフレッシュ2. access_tokenの内部設計2.1 access_t...

ページに間隔を空けてグリッドレイアウトを完璧に実装する方法

典型的なレイアウト例上の写真のように、正方形の真ん中に一定の隙間があり、その隙間は固定されています。...

Expressプロジェクトファイルディレクトリの説明と詳細な機能の説明

app.js: スタートアップファイル、またはエントリファイルpackage.json: プロジェク...

UbuntuからMySQLを削除して再インストールする方法

まずmysqlを削除します: sudo apt-get remove mysql-*残ったデータをク...

Linux システムのデュアル ネットワーク カード バインディング構成の実装

システムバージョン [root@ ~]# cat /etc/redhat-release CentO...

Zabbix を使用して ogg プロセスを監視する (Windows プラットフォーム)

この記事では、Windows プラットフォームで ogg プログラムを監視する方法を紹介します。 (...

JavaScript を使用して動的な QQ 登録ページを作成する

目次1. はじめに1. 基本レイアウト2. 写真を自動的に切り替える3. コンテンツを追加する4. ...

https暗号化アクセス用にnginxを設定するための詳細なチュートリアル

環境: 1 CentOS Linux リリース 7.5.1804 (コア)ファイアウォールと sel...

Node.js でメモリ効率の高いアプリケーションを作成する方法

目次序文問題: 大きなファイルのコピーNodeJS のストリームとバッファバッファストリーム解決策 ...