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

回答編集履歴

2

質問者さんコメントによる再補足

2015/11/04 12:02

投稿

TetsujiMiwa
TetsujiMiwa

スコア1124

answer CHANGED
@@ -27,4 +27,32 @@
27
27
  のような書き方をしないようにします。
28
28
  入力値が「'';delete from table;」だったら大変なことになりますから。
29
29
 
30
- ただ、これも後者の実装をよく目にします。(蛇足)
30
+ ただ、これも後者の実装をよく目にします。(蛇足)
31
+
32
+ ---
33
+
34
+ > チェックはかなり慎重に行っている
35
+ について誤解のないように再補足します。
36
+ チェックする内容は、セキュリティの目的ではなく、ユーザーへの思いやりです。
37
+
38
+ それは、入力チェックを入れたからセキュリティ対策が取れたとはいえないですし、
39
+ 逆に、入力チェックしなかったからといってセキュリティ対策が取れていないとも言えないです。
40
+
41
+ そもそもセキュリティ対策はテストきちんとすることです。
42
+ 例えば、ロジック内で使用しないパラメータがきたらエラーを返すなんていう処理はあまり見ないですが、
43
+ セキュリティ対策として、使用しないパラメータをわざと乗せてテストすることはあります。
44
+
45
+ さて、ユーザーへの思いやりとしての入力チェックですが、
46
+ ご質問の$login_idを例にします。
47
+
48
+ ・例えば、8文字しか入らないとか英数字のみだったりしたら、入力チェックどうします?
49
+ 思いやりの無い実装→どのみちSQLで取得できないだろうから、入力チェックしない
50
+ 思いやりのある実装→桁数チェックや英数字チェックしてNGなら、「英数8文字でご入力ください」と出力
51
+
52
+ ・例えば、未入力チェックをした場合、エラー文言はなんと出力します?
53
+ 思いやりの無い実装→「未入力です」
54
+ 思いやりのある実装→「正しいログインIDをご入力ください」
55
+
56
+ 更に思いやりがあれば、$login_idをトリムした上でチェックすることも検討できるかと思います。
57
+
58
+ 是非とも、ユーザーさんが路頭に迷わないような入力チェックを心がけてみてください。

1

SQLインジェクション対策追記

2015/11/04 12:02

投稿

TetsujiMiwa
TetsujiMiwa

スコア1124

answer CHANGED
@@ -13,4 +13,18 @@
13
13
  です。
14
14
  その意味は、「決まり事」というより本来の処理を実装する箇所で、入力値によるケースバイケースを考えたくないからですかね。
15
15
 
16
- 実際は、時間がなくてJavaScriptでだけチェックしてサーバー側ではチェックしてないケースが多々有ります。
16
+ 実際は、時間がなくてJavaScriptでだけチェックしてサーバー側ではチェックしてないケースが多々有ります。
17
+
18
+ SQLインジェクション対策について
19
+ SQLインジェクションの対策は、入力チェック時ではなく、
20
+ ```ここに言語を入力
21
+ $sql = " select * from table where key = ? ";
22
+ ```
23
+ みたいな感じで実装して、
24
+ ```ここに言語を入力
25
+ $sql = " select * from table where key = ".入力値." ";
26
+ ```
27
+ のような書き方をしないようにします。
28
+ 入力値が「'';delete from table;」だったら大変なことになりますから。
29
+
30
+ ただ、これも後者の実装をよく目にします。(蛇足)