例:
パブリック クラスJDBCDemo3 { 公共の 静的な 無効demo3_1(){ boolean型フラグ=ログイン(「AAA 『OR』」、「1651561」)は、 // ユーザ名が分かっている場合は、パスワードを知ることができないこの方法は、正常にログインできる 場合(フラグ){ System.out.println( "ログイン成功" ); } 他{ System.out.println( "ログインに失敗しました" ); } } パブリック 静的 ブールログイン(文字列名、文字列のパスワード){ 接続でCONN = nullを。 声明STAT = nullを。 ResultSetのRS = nullを。 ブールフラグ= 偽。 してみてください{ CONN = JDBCUtils.getConnection()。 SQL文字列 =「SELECT *ユーザ名は=ユーザーから「」+ユーザー名+ 『『ANDパスワード=』』 +パスワード+「」」; // 文字列の連結があるとして、ここでは、メイククエリSQLインジェクションの脆弱性への鍵であります次のようになります。
SELECT * FROM WHEREユーザー名=「AAA」OR「」とパスワード=「1651561」の、このクエリの結果セットが利用可能である、それはこの脆弱登場 STAT = conn.createStatement(); RS = stat.executeQuery(SQL)。 もし(rs.next()){ フラグ = 真。 } 他{ フラグ = 偽; } } キャッチ(のSQLException e)の{ e.printStackTrace(); } リターンフラグ。 }
ソリューションは、PrepareStatmentを使用しました:
パブリック 静的 ボイドdemo3_1(){ ブールフラグ= login1( "AAA 'OR'"、 "1651561" )。 もし{(フラグ) System.out.println( "ログイン成功" ); } 他{ System.out.println( "ログインに失敗しました" ); } } パブリック 静的 ブールlogin1(文字列名、文字列のパスワード){ 接続でCONN = nullを。 PreparedStatementのPSTAT = nullを。 ResultSetのRS = nullを。 ブールフラグ= 偽。 してみてください{ CONN = JDBCUtils.getConnection()。 SQL文字列 =「SELECT *ユーザ名とパスワードは= ?? =ユーザから」; // ?入力キーワードは、SQL SQL識別されません場合でも、代わりにパラメータの事前設定したSQLフォーマットの使用を PSTAT = conn.prepareStatement(SQL ); (pstat.setString。1、ユーザ名); // 疑問符の値に設定 pstat.setString(2 、パスワード); RS = pstat.executeQuery()。 もし(rs.next()){ フラグ = 真。 } 他{ フラグ = 偽; } } キャッチ(のSQLException e)の{ e.printStackTrace(); } リターンフラグ。 } }
SQLを介して成功したインジェクションの脆弱性にログインすることはできません上記のソリューションを使用します。