1

Springアプリケーション内でJDBCを使用する方法を学んでいますが、疑問があります。

それで、実際の例についての私の疑問を説明させてください:

DAOインターフェースを実装するクラスがあり、このクラスにデータベースのStudentテーブルに新しい行を挿入する次のメソッドが含まれている場合:

public void create(String name, Integer age) {
    String SQL = "insert into Student (name, age) values (?, ?)";

    jdbcTemplateObject.update(SQL, name, age);
    System.out.println("Created Record Name = " + name + " Age = " + age);
    return;
}

このメソッドには2つの入力パラメーターがあります。データベーステーブルの2つの列(NAMEとAGE)に関連するnameageです。

わかりました...SQL文字列は、テーブルに新しい行を挿入するために実行する必要があるSQLクエリを表していると思います

このコードの一部が正確に何を意味するのかを理解するのに問題があります:values(?、?)

JdbcTemplateオブジェクトでupdate()メソッドを呼び出すと、SQLクエリと名前および*年齢値がこれらに渡されると思いますか?プレースホルダーはこれらの値に置き換えられます。

したがって、クエリを実行できます。

正しいですか?

これらのプレースホルダーを置き換えるのはupdate()メソッドですか?

また、これらのプレースホルダーが使用されていることを読んだので、値をエスケープすることを心配する必要はありません...値をエスケープすることは正確にはどういう意味ですか?

そして最後の質問は、PreparedStatmentの使用についてです...私が読んだSpringのドキュメントを読んで、PreparedStatmentをupdate()メソッドに渡すこともできます...違いは何ですか?この場合、SQL文字列と2つの入力パラメーターを使用して新しいPreparedStatmentを作成するSpringですか、それとも別のものを使用していますか?

4

1 に答える 1

1

これは主にSQLインジェクションを回避するためです。

これを行った場合:

"insert into Student (name, age) values ('"+name+"', "+age+")"

もしそうならどうなるか考えてみてnameください"mary', 3), ('john', 13)--"

クエリは次のようになります。

insert into Student (name, age) values ('mary', 3), ('john', 13)--', 24)

そして、SQLコメントを無視すると--

insert into Student (name, age) values ('mary', 3), ('john', 13)

2つのレコードが挿入されます。

もちろん、名前文字列をエスケープまたはフィルタリングすることはできますが、エラーが発生しやすく、忘れやすく、一部のクエリを脆弱なままにしておくこともできます。プリペアドステートメントを使用してこれを不可能にすることもできます。

エスケープとは、SQLメタ文字の前にエスケープ文字を追加して、その意味を変更することを意味します。

名前をエスケープした場合、クエリは次のようになります。

insert into Student (name, age) values ('\', 3), (\'john\', 13)--', 24)

IEの名前は文字通りで"', 3), ('john', 13)--"あり、SQLインジェクションは発生しませんでした。

于 2013-02-19T16:39:32.487 に答える