2009-08-18 14 views
2

私はJDBCを初めて使用しており、新しいプロジェクトではJDBCを使用する必要があります。私が知りたいのは、JDBCは安全ですか?

はJDBCが安全ですか?

"Mysql Injection"のような問題を防ぐ方法は?

JDBCを使用する際に注意する必要があるセキュリティ上の問題は何ですか?

どのようにして、私はハッカーがデータベースをハックするのを防ぐために、セキュリティを最適化することを意味しますか?

EDIT:

私はgoogleの場合、私は、グーグルを試してみました:

"PHPのMySQLのセキュリティ問題を" 私はgoogleの場合=>それは結果

の多くを与える:

「JDBC mysqlのセキュリティ上の問題 "=>関連するページはほとんどありません

jdbcは安全ですか?ハックを心配する必要はありませんか?

+3

誰かが「x is secure」という質問をするたびに、コードにセキュリティ脆弱性が存在する可能性が高いと思います。なぜなら、セキュリティは事実よりもプロセスのほうが多いからです。コード/ツール/サイトは安全ではありません。それらは実行され、安全な方法で使用され(または使用されない)、既知の脆弱性が存在する可能性があります。人々はXの安全を尋ねるとき、答えが「はい」であれば、もはやセキュリティについて考える必要はないと考える傾向があります。その考え方は脆弱性につながります。 – Yishai

答えて

11

使用prepared statements。仮想ログインの場合は、次のように使用します。

PreparedStatement stmt = conn.prepareStatement("SELECT * FROM member WHERE member_username = ? AND member_password = ?"); 
stmt.setString(1, username); 
stmt.setString(2, password); 
stmt.execute(); 

ResultSet rs = stmt.getResultSet(); 
// ... 

これはSQLインジェクションの脆弱性から完全に保護されます。

+1

ありがとう、これは私が現在のコードで持っているものです。私は準備されたステートメントを意味します。私は今安心しています:) –

+0

これはPHP/MySQLだけでなく、他の現代/ Webプログラミング言語にも当てはまります。 –

+0

安全でないバージョンとは何ですか? – ZeroCool

5

JDBCデータベース接続プロトコルであり、それはデータベースに接続するすべての他の手段と同じくらい安全です。

ほとんどのセキュアな問題は、JDBCプロトコル自体とは関係ありません。たとえば、Prepared Statementを使用してSQLインジェクションのリスクを最小限に抑えることができます。これは、データベースへの接続方法に関係なく真です。

+0

すばらしい説明。私は今、理解しています。 –

2

JDBCは純粋にプログラムとデータベースの間の転送です。

サインオンプロトコルがネットワークスニッフィングに対して脆弱でない限り、ネットワークトラフィックに何かを注入することは非常に困難です。

しかしJDBCは、単にデータベースにあなたのSQLを輸送し、得られたデータセットを返します。 あなたのプログラムがSQLインジェクションを強要する場合、直接接続、ODBCまたはJDBCを使用しているかどうかにかかわらず、脆弱になります。

本当にSQLインジェクションから身を守るための唯一の方法は、とのプリペアドステートメントを使用することです「?」ユーザー入力用のプレースホルダを使用します。安全でない入力を使用して、SQLステートメントを一緒にストリングしないでください(これには、直接ユーザー入力と、ユーザーが入力した表のデータの両方が含まれます)。

10

はJDBCで保護されていますか?

JDBCのセキュリティは、使用するJDBCドライバのプロパティです。一般に、ドライバがSSLトランスポート層を使用する場合、ドライバはSSLキーの強度と同じくらい安全です。暗号化されていないトランスポートを使用する場合は、安全ではありません。

"Mysql Injection"のような問題を防ぐにはどうすればよいですか?

JDBCのSQLクエリを作成するときに、埋め込みSQLを含む可能性のある「生の」文字列を組み入れないように注意してください。たとえば:someStringはエスケープ「'」文字が含まれている場合

String query = "SELECT * FROM SOME_TABLE WHERE X = '" + someString + "' ;"; 

、何をSQL文字列リテラルになろうとすることは実際には完全に別のものに変えることができます。修正は、 "'"文字(または他のnasties)が含まれている場合はsomeStringを拒否するか、SQL文字列エスケープを挿入するメソッドで前処理します。

別の(より単純で信頼性の高い)アプローチは、準備済みのステートメントを "?"で使用することです。プレースホルダを使用して、値をsetString(...)などを使用してクエリに挿入します。

JDBCを使用する際に注意する必要があるセキュリティ上の問題は何ですか?

上記以外に、私はJDBCに固有のものについては何も知らない。実際、上記の問題のいずれもJDBCに固有のものではありません。

どのようにして、私はハッカーがデータベースをハックするのを防ぐために、セキュリティを最適化することを意味しますか?

  1. 安全なシステムを構築するための良い本を購入してください。
  2. 注意してください。
  3. あなたのコード/システムを監査するセキュリティ専門家に支払う。
2

また、ユーティリティメソッド「org.apache.commons.lang.StringEscapeUtils.escapeSql(java.lang.String str)」を使用すると、SQLインジェクションが実行されないようにすることができます。

文字列の衛生管理は、SQLインジェクション攻撃またはクロスサイトスクリプティング攻撃を防止するために、常に最善の方針です。

+2

FWIW、StringEscapeUtilsには、もはやescapeSqlメソッドが含まれていません:http://commons.apache.org/lang/api-3.1/org/apache/commons/lang3/StringEscapeUtils.html –

0

DB acceess apiに何かを渡す前に、特定の正規表現規則に一致するフィールドバリデータを必ず使用してください。

関連する問題