2

だから私はこのコードスニペットを持っています:

String username = props.getProperty("jdbc.username");
try {
                String username = parts[1];

                // Check procedure
                System.out.println("Checking user");

                // Check database user table for username
                conn = getSQLConnection();
                Statement stat = conn.createStatement();
                ResultSet user = stat.executeQuery( "SELECT * FROM USER WHERE log_id='" + username + "';" );
                // Check given password against user entry
                if(user.next()){
                    System.out.println("User Exists: " + username);
                    sendMessage("true");
                    return;
                }
                else{

                    System.out.println("User Does Not Exist: " + username);
                    sendMessage("false user");
                    return;
                }

教育目的で、入力がどこから来ているかを知っていても、SQL ステートメントは SQL インジェクションから保護されていますか?

4

2 に答える 2

6
ResultSet user = stat.executeQuery( "SELECT * FROM USER WHERE log_id='" + username + "';" );

これは、SQL インジェクションの影響を受けます。

username次の値があるとどうなるか想像してみてください。

John'; delete from user where 'a' = 'a

そして、はい、Java JDBC SQL チュートリアルの*負荷として、これは間違っています。基本的には常にPreparedStatements を使用します。

これにより、上記のように悪意のある値が含まれていても安全に使用できるようになるだけでなくusername、さらに重要なことに、RDBMS エンジンはそれ以降のすべての呼び出しで同じクエリを再利用できるためです。

要するに、それらを使用しない理由はまったくありません。また、文字列の連結を使用した SQL のデモを行うチュートリアルは、苦痛を伴う SQL インジェクションによる死を迎えるはずです。

于 2015-04-20T21:45:44.127 に答える