2011.07.05

【Android】SQLiteのクエリ作成

AndroidにはSQLiteが標準でついている。

しかし、どちらが悪いのかはしらないけれど安全なクエリを作成しようとすると
一部機能がかけたりしてるのでまとめてみます。

SQLiteStatement

SQLiteStatementを使うことで Java等 でよく使う ?置換 を行える

Link:Android:SQLiteStatementクラス

SQLiteStatement stmt;

stmt = sdb.compileStatement("INSERT INTO rss( url ) VALUES( ? );");

stmt.bindString( 1, szUrl );
//String以外には以下のものがあり
//bindBlob
//bindDouble
//bindLong
//bindNull

//実行
stmt.executeInsert();

これでインジェクション攻撃に強くなるかと思いきや
これは結果をほとんど返さない処理でないと使えないらしい。
いわゆる、SELECTでは使えない。

SelectではSQL文を作成するしか道はなさそう

メモ)
SQLiteDatabase.queryというので引数を指定するだけでできるようなものもあるみたいけど
ぱっと見使い方がわからないので放置

SELECT文のインジェクション攻撃対策

引数のエスケープは DatabaseUtils.sqlEscapeString を使うとよさげ
Link:Android:DatabaseUtilsクラス

SQLiteDatabase.rawQueryを使えば通常のSelectを処理することができる。
返り値はCursorというものになる。
Link:Android:SQLiteDatabaseクラス Android:Cursorクラス

使い方はこんな感じ

//猫の名前をユーザー入力で検索することを仮定
//sqlEscapeStringは自動的にクオートをつけてくれる
String szSql;
szSql = "SELECT * FROM neko WHERE name=" + DatabaseUtils.sqlEscapeString( szName ) + ";";

//クエリを実行して読み出し用カーソルを取得
Cursor c;
c = sdb.rawQuery( szSql, null );

//先頭より処理開始
c.moveToFirst();

while( true )
{
	//こんな感じで1列目を取得
	String szWork = c.getString(0);
	
	//最後であれば終了
	if( c.isLast() == true )
	{
		break;
	}
	else
	{
		//次の行へ
		c.moveToNext();
	}
}

//とじる
c.close();

と、こんな感じでやっていくと安全だと思ってみる。

まあ、盗まれていいものをローカルのDBにおくのが間違いといわれればそうかもしれない

だけどDBがあるとないとでは世界が違ってくるので
有効につかっていきたいの~

ニャッキ格闘列伝 > プログラム >

前の記事:
次の記事:

関連記事

コメントリスト

コメントなし

コメント



*

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

こんなタグが使えるみたいよ:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>