0

_username の値が列「username」に既に存在するかどうかを確認するために、この方法が正しいかどうか疑問に思っています

public boolean verification(String _username) throws SQLException{
    Cursor c = dataBase.rawQuery("SELECT * FROM "+TABLE_NAME+" WHERE "+KEY_USERNAME+"="+_username, null);
    if (c!=null)
        return true; // return true if the value of _username already exists
    return false; // Return false if _username doesn't match with any value of the columns "Username"
}

同じことを行うためのより良い方法はありますか。これについてはよくわかりません。私にとっては正しいように思えました。ありがとう。

4

2 に答える 2

6

SQLインジェクション攻撃注意してください!常にパラメーター化されたクエリを使用する必要があります。

Cursor c = dataBase.rawQuery("SELECT 1 FROM "+TABLE_NAME+" WHERE "+KEY_USERNAME+"=?", new String[] {_username});

(正直なところ、文字列を引用符で囲むのを忘れたため、最初のクエリで例外がスローされなかった方法はわかりません...)

またrawQuery()、常にカーソルを返します。カーソルがではなく、空かどうかを確認する必要がありますnull


「最良の」アプローチに関しては、これは問題なく機能しますが、リソースを解放するためにカーソルを閉じることをお勧めします。すべて一緒に:

public boolean verification(String _username) {
    Cursor c = dataBase.rawQuery("SELECT 1 FROM "+TABLE_NAME+" WHERE "+KEY_USERNAME+"=?", new String[] {_username});
    boolean exists = c.moveToFirst();
    c.close();
    return exists;
}
于 2013-03-23T16:13:51.040 に答える
2

同じことをするためのより良い方法はありますか、私はこれについて本当によくわかりません、それは私にとって正しいようでした。ありがとう。

セキュリティと純度の観点からは、確かにそうです。

public boolean verification(String _username) throws SQLException {
    int count = -1;
    Cursor c = null; 
    try {
       String query = "SELECT COUNT(*) FROM " 
                   + TABLE_NAME + " WHERE " + KEY_USERNAME + " = ?"
       c = dataBase.rawQuery(query, new String[] {_username});
       if (c.moveToFirst()) {
          count = c.getInt(0);
       }
       return count > 0;
    }
    finally {
       if (c != null) {
          c.close();
       }
    }
}

プレースホルダー?と呼ばれる使用法をお勧めします。各プレースホルダーは、同じ順序で文字列配列の値に置き換えられます。これは、SQLインジェクションに対する防御として、パラメーター化されたステートメントとも呼ばれます。カーソルでの作業が終了したら、カーソルを離します。

于 2013-03-23T16:14:20.503 に答える