2011-12-21 14 views
1

私は、SQLと更新されたテーブルを受け入れた更新クラスを持っていました。私はJavaを使用しています。私はそれをこのようこれらのうちどれを使用するのがベストですか?その理由は何ですか?

sqls = "INSERT INTO statistics(TeamName, Wins, Draws, Losses, Points, DatePlayed) VALUES (?,?,?,?,?,?)" 
Class.forName("com.mysql.jdbc.Driver").newInstance(); 
con = DriverManager.getConnection("jdbc:mysql://localhost/players","root", "123"); 
stmt = con.prepareStatement(sqls); 
stmt.setString(1, var1); 
stmt.setInt(2, var2); 
stmt.setInt(3, var3); 
stmt.setInt(4, var4); 
stmt.setInt(5, var5); 
stmt.setTimestamp(6, var6); 
int updaterows = stmt.executeUpdate(); 

1が優れていると、なぜそれが本当に両方の方法を働いたとして、私は混乱しました喜ばなかった

sqls = "INSERT INTO statistics(ID, TeamName, Wins, Draws, Losses, Points, DatePlayed) VALUES (0 ,'"+var1+"',"+var2+","+var3+","+var4+","+var5+",'"+ date +"')"; 
Class.forName("com.mysql.jdbc.Driver").newInstance(); 
con = DriverManager.getConnection("jdbc:mysql://localhost/players","root", "123"); 
stmt = con.prepareStatement(sqls); 
int updaterows = stmt.executeUpdate(sqls); 

先生、このようにそれをやりました。

答えて

8

間違いなく2番目の方法、つまり先生の方法を使用します。コードはsql injectionになりやすいので、あなたの方法は非常に危険です。どの人もDROP DATABASEと入力してTeamNameと入力すると、データベースは削除されます。

P.Sいくつかの楽しみ - Bobby Tables

+0

私は尋ねたので、教師は私に2番目の理由を教えてくれなかった – owen

4

sql injection攻撃を防ぐことができるため、教師のやり方が優れています。

0

2番目のバージョンでは、クエリのパラメータが使用され、SQLインジェクションの観点から安全です。詳細はGoogle SQLインジェクションを参照してください。

2

第二の方法は、多くの点で(teacher`s方法)優れている:

セキュリティ:

は、SQLインジェクション攻撃を防ぐことができます。 参考:https://www.owasp.org/index.php/Preventing_SQL_Injection_in_Java

スケーラビリティ:

それは、繰り返し文字列連結によって引き起こされる過度のメモリ使用量を防ぐことができます。 参考:http://docs.oracle.com/cd/E18930_01/html/821-2431/abebf.html#abebh

パフォーマンス:

それは準備された文(プリコンパイルされたSQLクエリ)を作成するために、データベースを可能にします。 参考:http://docs.oracle.com/javase/1.4.2/docs/api/java/sql/PreparedStatement.html

保守性:

それはコンパイル時にSQLパラメータの型チェックが可能になります。

1

2つ目の方法は、より安全でSQLインジェクションを防ぐことができるため、より良い方法です。しかし、私は誰もがスキップした1つのことを指摘したい、準備されたステートメントの使用、PreparedStatementコールは事前にコンパイルされ、より良いパフォーマンスを提供します。

セッションでステートメントが複数回使用される場合、ステートメントをプリコンパイルすると、データベースに送信し、使用ごとにコンパイルするよりもパフォーマンスが向上します。ステートメントが複雑になればなるほど、パフォーマンスのメリットは大きくなります。 ステートメントが数回しか使用されない場合、プリコンパイルはプリコンパイル、保存、後でデータベース内の割当て解除に伴うオーバーヘッドのために非効率的な場合があります。

また、CallableStatementをチェックするようアドバイスします。ストアドプロシージャを作成し、その内部にSQLクエリを配置し、CallableStatementを使用してストアドプロシージャを実行することができます。 Callable Statementは、データベース全体(リモートデータベースを持ち、ネットワークが遅い場合はパフォーマンスに気づくでしょう)とセキュリティが向上しているため、パフォーマンスがさらに向上します。

関連する問題