回答編集履歴
9
追記
answer
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
|
4
4
|
[EditText](https://developer.android.com/reference/android/widget/EditText.html)は画面の項目ですよね。画面の入力項目の値をSQLにそのまま渡していると仮定して回答しますが、
|
5
5
|
質問文のコードはdb#execSQLが引数で渡されたSQL文字列に対して、
|
6
|
-
サニタイジング(無害化)を行っていない限り、画面のレイアウト定義とbodyStr
|
6
|
+
サニタイジング(無害化)を行っていない限り、画面のレイアウト定義とbodyStr,d,idの型によりますが、`SQL Injection`が実行可能なコードになります。
|
7
7
|
|
8
8
|
SQL Injection防止のため、**文字列(String)でSQLを結合することは避けて**、`バインドパラメータ`を使用してくださいな。
|
9
9
|
|
8
totalに加算するということはdは数値型相当なため問題ないので、訂正
answer
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
|
4
4
|
[EditText](https://developer.android.com/reference/android/widget/EditText.html)は画面の項目ですよね。画面の入力項目の値をSQLにそのまま渡していると仮定して回答しますが、
|
5
5
|
質問文のコードはdb#execSQLが引数で渡されたSQL文字列に対して、
|
6
|
-
サニタイジング(無害化)を行っていない限り、画面のレイアウト定義と
|
6
|
+
サニタイジング(無害化)を行っていない限り、画面のレイアウト定義とbodyStrとidの型によりますが、`SQL Injection`が実行可能なコードになります。
|
7
7
|
|
8
8
|
SQL Injection防止のため、**文字列(String)でSQLを結合することは避けて**、`バインドパラメータ`を使用してくださいな。
|
9
9
|
|
7
検証ではなくサニタイジング(無害化)なため言葉を訂正
answer
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
|
4
4
|
[EditText](https://developer.android.com/reference/android/widget/EditText.html)は画面の項目ですよね。画面の入力項目の値をSQLにそのまま渡していると仮定して回答しますが、
|
5
5
|
質問文のコードはdb#execSQLが引数で渡されたSQL文字列に対して、
|
6
|
-
|
6
|
+
サニタイジング(無害化)を行っていない限り、画面のレイアウト定義とdの型によりますが、`SQL Injection`が実行可能なコードになります。
|
7
7
|
|
8
8
|
SQL Injection防止のため、**文字列(String)でSQLを結合することは避けて**、`バインドパラメータ`を使用してくださいな。
|
9
9
|
|
@@ -21,7 +21,7 @@
|
|
21
21
|
row_count = stmt.executeUpdateDelete();
|
22
22
|
switch(row_count) {
|
23
23
|
case 0:
|
24
|
-
// 対象データなし
|
24
|
+
// 更新対象データなし
|
25
25
|
Log.e("sql", stmt.toString());
|
26
26
|
break;
|
27
27
|
case 1:
|
@@ -30,6 +30,7 @@
|
|
30
30
|
break;
|
31
31
|
default:
|
32
32
|
// 複数件(データ不整合)
|
33
|
+
// 本当に起こり得ないなら、特別なエラー処理を行った方がいいです。
|
33
34
|
Log.e("sql", stmt.toString());
|
34
35
|
break;
|
35
36
|
}
|
6
ローカル環境で適当なテーブルを作って動作確認したので訂正
answer
CHANGED
@@ -8,7 +8,7 @@
|
|
8
8
|
SQL Injection防止のため、**文字列(String)でSQLを結合することは避けて**、`バインドパラメータ`を使用してくださいな。
|
9
9
|
|
10
10
|
質問文にはテーブル定義やテーブルデータが無いため、データの型を推測して回答します。
|
11
|
-
|
11
|
+
こんな感じになります。
|
12
12
|
|
13
13
|
```Java
|
14
14
|
final String sql = "UPDATE MEMO_TABLE SET body=?,total=total+? WHERE uuid=?";
|
5
stmt.closeを2回実行しているので、訂正!
answer
CHANGED
@@ -32,13 +32,12 @@
|
|
32
32
|
// 複数件(データ不整合)
|
33
33
|
Log.e("sql", stmt.toString());
|
34
34
|
break;
|
35
|
-
}
|
36
|
-
}finally {
|
37
|
-
stmt.close();
|
38
35
|
}
|
39
36
|
}finally {
|
40
37
|
stmt.close();
|
41
38
|
}
|
42
39
|
```
|
43
40
|
■参考情報
|
44
|
-
[SQLiteStatement](https://developer.android.com/reference/android/database/sqlite/SQLiteStatement.html)
|
41
|
+
- [SQLiteStatement](https://developer.android.com/reference/android/database/sqlite/SQLiteStatement.html)
|
42
|
+
- [SQLiteProgram](https://developer.android.com/reference/android/database/sqlite/SQLiteProgram.html)
|
43
|
+
- [ContentValues](https://developer.android.com/reference/android/content/ContentValues.html)
|
4
インデントとuuidをbindStringに変更
answer
CHANGED
@@ -17,22 +17,25 @@
|
|
17
17
|
try {
|
18
18
|
stmt.bindString(1, bodyStr);
|
19
19
|
stmt.bindLong(2, d);
|
20
|
-
stmt.
|
20
|
+
stmt.bindString(3, id);
|
21
21
|
row_count = stmt.executeUpdateDelete();
|
22
|
-
|
22
|
+
switch(row_count) {
|
23
|
-
|
23
|
+
case 0:
|
24
|
-
|
24
|
+
// 対象データなし
|
25
|
-
|
25
|
+
Log.e("sql", stmt.toString());
|
26
|
-
|
26
|
+
break;
|
27
|
-
|
27
|
+
case 1:
|
28
|
-
|
28
|
+
// 正常時:更新件数が1件の時
|
29
|
-
|
29
|
+
Log.d("sql", String.valueOf(row_count));
|
30
|
-
|
30
|
+
break;
|
31
|
-
|
31
|
+
default:
|
32
|
-
|
32
|
+
// 複数件(データ不整合)
|
33
|
-
|
33
|
+
Log.e("sql", stmt.toString());
|
34
|
-
|
34
|
+
break;
|
35
35
|
}
|
36
|
+
}finally {
|
37
|
+
stmt.close();
|
38
|
+
}
|
36
39
|
}finally {
|
37
40
|
stmt.close();
|
38
41
|
}
|
3
if文からswitchに変更!
answer
CHANGED
@@ -19,9 +19,20 @@
|
|
19
19
|
stmt.bindLong(2, d);
|
20
20
|
stmt.bindLong(3, id);
|
21
21
|
row_count = stmt.executeUpdateDelete();
|
22
|
-
|
22
|
+
switch(row_count) {
|
23
|
+
case 0:
|
24
|
+
// 対象データなし
|
23
|
-
|
25
|
+
Log.e("sql", stmt.toString());
|
26
|
+
break;
|
27
|
+
case 1:
|
28
|
+
// 正常時:更新件数が1件の時
|
29
|
+
Log.d("sql", String.valueOf(row_count));
|
30
|
+
break;
|
31
|
+
default:
|
32
|
+
// 複数件(データ不整合)
|
33
|
+
Log.e("sql", stmt.toString());
|
34
|
+
break;
|
24
|
-
|
35
|
+
}
|
25
36
|
}finally {
|
26
37
|
stmt.close();
|
27
38
|
}
|
2
追記
answer
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
質問の回答は他の回答者様で既に出ていますが、`SQL Injection`について
|
2
2
|
> db.execSQL("update MEMO_TABLE set body = '" + bodyStr + "', total='"+d+"total"+"' where uuid = '" + id + "'");
|
3
3
|
|
4
|
-
[EditText](https://developer.android.com/reference/android/widget/EditText.html)は画面の項目ですよね。
|
4
|
+
[EditText](https://developer.android.com/reference/android/widget/EditText.html)は画面の項目ですよね。画面の入力項目の値をSQLにそのまま渡していると仮定して回答しますが、
|
5
5
|
質問文のコードはdb#execSQLが引数で渡されたSQL文字列に対して、
|
6
|
-
`SQL Injection`の検証をしていない限り、dの型
|
6
|
+
`SQL Injection`の検証をしていない限り、dの型によりますが、`SQLInjection`が可能なコードになります。
|
7
7
|
|
8
8
|
SQL Injection防止のため、**文字列(String)でSQLを結合することは避けて**、`バインドパラメータ`を使用してくださいな。
|
9
9
|
|
10
|
-
質問文にはテーブル定義やテーブルデータが無いため、データの型を推測して回答します
|
10
|
+
質問文にはテーブル定義やテーブルデータが無いため、データの型を推測して回答します。
|
11
11
|
動作確認してませんが、こんな感じに。あとは頑張ってくださいな。
|
12
12
|
|
13
13
|
```Java
|
1
追記
answer
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
質問の回答は他の回答者様で既に出ていますが、`SQL Injection`について
|
2
2
|
> db.execSQL("update MEMO_TABLE set body = '" + bodyStr + "', total='"+d+"total"+"' where uuid = '" + id + "'");
|
3
3
|
|
4
|
+
[EditText](https://developer.android.com/reference/android/widget/EditText.html)は画面の項目ですよね。
|
4
5
|
質問文のコードはdb#execSQLが引数で渡されたSQL文字列に対して、
|
5
|
-
`SQL Injection`の検証をしていない限り、`SQLInjection`が可能なコードになります。
|
6
|
+
`SQL Injection`の検証をしていない限り、dの型と値によりますが、`SQLInjection`が可能なコードになります。
|
6
7
|
|
7
8
|
SQL Injection防止のため、**文字列(String)でSQLを結合することは避けて**、`バインドパラメータ`を使用してくださいな。
|
8
9
|
|