2

SQLインジェクションを防ぐ方法私は以下のコードを使用してログインしています

con = DriverManager.getConnection("", "", "");

Statement  statement = con.createStatement();

ResultSet  rs= statement.executeQuery("SELECT email,pass FROM db_pass where email='" + email + "'and pass='" + password + "'"    );

if (rs.next()) {

    String a=rs.getString(1);
    String b=rs.getString(2);
    rs.close();

正常に動作しますが、(nitin' OR '1'='1) を入力すると、ユーザーは有効なパスワードを入力せずにアクセスできます

4

4 に答える 4

7

を使用しPreparedStatementます。http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.htmlで例を見つけることができます

SQL インジェクションを防ぐには、すべてのクエリをパラメータ化する必要があり、文字列連結を使用して動的 SQL を作成しないでください。

于 2012-04-28T07:26:52.480 に答える
0

ORM (オブジェクト リレーショナル マッパー) を使用することをお勧めします。通常、ORM には SQL インジェクションに対する防御機能が組み込まれています。

SQL インジェクションを防ぐもう 1 つの優れた方法は、ホワイト リスト (つまり、許容されるユーザー入力のリスト) を使用することです。ユーザーから入力を受け取ったら、それがホワイト リストにあるかどうかを確認します。そうでない場合は拒否します。

あなたの場合、可能なユーザー名のホワイトリストと可能なパスワードのホワイトリストが必要です。正規表現を使用して、ユーザー名のホワイト リストとパスワードのホワイト リストを記述できます。ただし、独自の正規表現を自作しないでください。事前に作成された正規表現がオンラインで入手できます。SQL インジェクションに対して脆弱になるような式の間違いを犯しやすいため、独自のものを作成したくありません。

これが役に立てば幸いです、頑張ってください!

于 2012-04-28T07:36:00.010 に答える
-1

これを行う典型的で簡単な方法は、ハッシュ操作 (md5 または sha1) の結果を比較することです。クエリは次のようになります

SELECT email, pass from db_pass where md5(email)='" + md5(email) + "' and md5(pass)='" + md5(password) + "'"

ただし、これは、これを開発している言語で使用可能な md5 関数があり、DB システムにも使用可能な md5 関数があることを意味します (たとえば、mysql はそうです)。これはSQLインジェクションを完全に不可能にするわけではありませんが、あなたが与える例に対する優れた基本的な保護であることに注意してください.

于 2012-04-28T07:30:23.687 に答える
-1

文字列を変換する必要があります。文字列が abc' の場合、文字列が '' のようになっている場合は、文字列 abc'' を sql に渡す必要があります。

于 2012-04-28T07:40:27.403 に答える