SQL インジェクションをゼロから理解します。SQL インジェクションとは何ですか? SQLインジェクションとは、データベースを操作できるのは私だけですが、あなたがコマンドを入力することで、私の知らないうちにデータベースが操作されるという意味です
通常のログイン シナリオである次のケース シナリオを見てください:
そして、ユーザー名 ': – を使用すると、次のように入力しても正常にログインできます。パスワードをさりげなく↓
このとき、実際にはユーザー名にSQL記号を書いて内部SQLを早めに終了させ、検索をコメントアウトしたことが2つのSQLを比較すると分かります。文の後半にある条件を変更して、パスワード不要のログイン効果を実現します。
SQLインジェクションは、私がデータベースを操作できるのは私だけであることを意味しますが、あなたはコマンドを入力することで、私の知らないうちにデータベースを操作します
誤って表示される理由は、上記の SQL が動的スプライシングを使用しているため、SQL が渡される方法によって SQL のセマンティクスが変更される可能性があるためです。
動的スプライシングは、Java変数とJavaのSQLステートメントを混合して使用することです: select * from user where userName='"+userName+"' およびpassword = '"+password"'
したがって、preparedStatementを使用してくださいパラメータ化された SQL では、最初にセマンティクスを決定してからパラメータを渡すことにより、渡されたパラメータによって SQL のセマンティクスが変更されることはありません。 (パラメーターは setInt、setString、setBoolean を通じて渡されます)
//建立数据连接 conn=ds.getConnection(); //1.设置prepareStatement带占位符的sql语句 PreparedStatement ptmt = conn.prepareStatement("select * from user where userName = ? and password = ?"); ptmt.setString(1, "张三"); //2.设置参数 ptmt.setString(2, "123456"); rs=ptmt.executeQuery(); while(rs.next()){ System.out.println("登陆成功"); return; } System.out.println("登陆失败");
パラメーター化された機能:
1. プレースホルダーを使用した PreparedStatement SQL ステートメントの設定
実行するSQL ステートメント:
stmt=conn.createStatement(); rs=stmt.executeQuery("select userName from user");
2. パラメーターの設定
PerparedStatement は Statement を継承しており、ここではパラメーター化された SQL にする機能が主に使用されます。
再投稿: https://blog.csdn.net/qq_30258957/article/details/78145885
追加: 1. PreparedStatement は SQL の実行に使用される Statement を拡張します。
2.Statement は静的 (無条件) SQL PreparedStatement は動的 (条件付き) SQL の実行に適しています。
3. PreparedStatement はインジェクション攻撃を回避できます。
SQLインジェクションの深い理解と予防策 SQLインジェクションに対する防御 - PHP実践モール開発ビデオチュートリアル以上がSQLインジェクションとは何ですか? SQL インジェクションをゼロから理解できるようにしますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。