teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

9

追記

2018/01/21 09:26

投稿

umyu
umyu

スコア5846

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
- サニタイジング(無害化)を行っていない限り、画面のレイアウト定義とbodyStridの型によりますが、`SQL Injection`が実行可能なコードになります。
6
+ サニタイジング(無害化)を行っていない限り、画面のレイアウト定義とbodyStr,d,idの型によりますが、`SQL Injection`が実行可能なコードになります。
7
7
 
8
8
  SQL Injection防止のため、**文字列(String)でSQLを結合することは避けて**、`バインドパラメータ`を使用してくださいな。
9
9
 

8

totalに加算するということはdは数値型相当なため問題ないので、訂正

2018/01/21 09:26

投稿

umyu
umyu

スコア5846

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
- サニタイジング(無害化)を行っていない限り、画面のレイアウト定義とdの型によりますが、`SQL Injection`が実行可能なコードになります。
6
+ サニタイジング(無害化)を行っていない限り、画面のレイアウト定義とbodyStrとidの型によりますが、`SQL Injection`が実行可能なコードになります。
7
7
 
8
8
  SQL Injection防止のため、**文字列(String)でSQLを結合することは避けて**、`バインドパラメータ`を使用してくださいな。
9
9
 

7

検証ではなくサニタイジング(無害化)なため言葉を訂正

2018/01/21 09:20

投稿

umyu
umyu

スコア5846

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
- `SQL Injection`の検証ていない限り、dの型によりますが、`SQLInjection`が可能なコードになります。
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

ローカル環境で適当なテーブルを作って動作確認したので訂正

2018/01/21 09:15

投稿

umyu
umyu

スコア5846

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回実行しているので、訂正!

2018/01/20 22:35

投稿

umyu
umyu

スコア5846

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に変更

2018/01/20 21:45

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -17,22 +17,25 @@
17
17
  try {
18
18
  stmt.bindString(1, bodyStr);
19
19
  stmt.bindLong(2, d);
20
- stmt.bindLong(3, id);
20
+ stmt.bindString(3, id);
21
21
  row_count = stmt.executeUpdateDelete();
22
- switch(row_count) {
22
+ switch(row_count) {
23
- case 0:
23
+ case 0:
24
- // 対象データなし
24
+ // 対象データなし
25
- Log.e("sql", stmt.toString());
25
+ Log.e("sql", stmt.toString());
26
- break;
26
+ break;
27
- case 1:
27
+ case 1:
28
- // 正常時:更新件数が1件の時
28
+ // 正常時:更新件数が1件の時
29
- Log.d("sql", String.valueOf(row_count));
29
+ Log.d("sql", String.valueOf(row_count));
30
- break;
30
+ break;
31
- default:
31
+ default:
32
- // 複数件(データ不整合)
32
+ // 複数件(データ不整合)
33
- Log.e("sql", stmt.toString());
33
+ Log.e("sql", stmt.toString());
34
- break;
34
+ break;
35
35
  }
36
+ }finally {
37
+ stmt.close();
38
+ }
36
39
  }finally {
37
40
  stmt.close();
38
41
  }

3

if文からswitchに変更!

2018/01/20 20:43

投稿

umyu
umyu

スコア5846

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
- if (row_count == 0) {
22
+ switch(row_count) {
23
+ case 0:
24
+ // 対象データなし
23
- Log.e("sql", stmt.toString());
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

追記

2018/01/20 20:34

投稿

umyu
umyu

スコア5846

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の型と値によりますが、`SQLInjection`が可能なコードになります。
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

追記

2018/01/20 19:00

投稿

umyu
umyu

スコア5846

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