質問編集履歴

6

分かりやすく編集しました

2020/09/22 05:21

投稿

kkkkk13n
kkkkk13n

スコア14

test CHANGED
File without changes
test CHANGED
@@ -6,11 +6,27 @@
6
6
 
7
7
 
8
8
 
9
- 行った対策
9
+ **行った対策**
10
10
 
11
11
  0. CSRF対策(秘密トークンの発行)
12
12
 
13
+ ```ここに言語を入力
14
+
15
+ //トークン発行
16
+
17
+ $_SESSION['ticket'] = sha1(uniqid(mt_rand(), TRUE));
18
+
19
+
20
+
21
+ //post受け取り時にトークンの一致を確認
22
+
23
+ if (isset($_POST['under'], $_SESSION['ticket']) && hash_equals($_POST["ticket"], $_SESSION["ticket"])) {
24
+
25
+ //trueの場合進める
26
+
27
+ ```
28
+
13
- 0. セッションハイジャック
29
+ 2. セッションハイジャック
14
30
 
15
31
  0. エスケープ処理
16
32
 
@@ -18,9 +34,21 @@
18
34
 
19
35
  0. 数値のみ入力可能なバリデーション
20
36
 
37
+ ```ここに言語を入力
38
+
39
+ if (!preg_match('/^([0-9]{1,3})$/', $under)) {
40
+
41
+ $error['under'] = '3桁以内の数字で入力してください';
42
+
43
+ }
44
+
45
+ ```
21
46
 
22
47
 
48
+
49
+
50
+
23
- ※セキュリティの関係からコードは割愛してます。
51
+ ※セキュリティの関係からコードは割愛してる場合あります。
24
52
 
25
53
 
26
54
 

5

セキュリティ的に公開したくないコードがあった

2020/09/22 05:21

投稿

kkkkk13n
kkkkk13n

スコア14

test CHANGED
@@ -1 +1 @@
1
- 【PHP】作成したフォームに脆弱性がないか、アドバイスをして頂けませんか
1
+ 【PHP】作成したフォームに脆弱性がないか、アドバイスをして頂けませんか
test CHANGED
@@ -2,191 +2,33 @@
2
2
 
3
3
 
4
4
 
5
- ECサイト内で動くプログラなので、脆弱性はできるだけ取り除きたいです
5
+ フォームは最大3文字しか入力でません
6
6
 
7
7
 
8
8
 
9
- size.php ↓
9
+ 行った対策
10
10
 
11
- ```ここに言語を入力
11
+ 0. CSRF対策(秘密トークンの発行)
12
12
 
13
- <?php
13
+ 0. セッションハイジャック
14
14
 
15
+ 0. エスケープ処理
16
+
17
+ 0. クリックジャッキング
18
+
15
- session_start();
19
+ 0. 数値のみ入力可能なバリデーション
16
20
 
17
21
 
18
22
 
19
- //セッションIDを更新して変更(セッションハイジャック対策)
20
-
21
- session_regenerate_id(TRUE);
23
+ ※セキュリティの関係からコードは割愛してます。
22
24
 
23
25
 
24
26
 
25
- //他のページのiframe内に表示されないようにする
27
+ **・秘密トークン発行により外部ページのpostは受け取らない**
26
-
27
- header('X-FRAME-OPTIONS:DENY');
28
28
 
29
29
 
30
30
 
31
- //functions.phpの呼び出し
32
-
33
- require './libs/functions.php';
34
-
35
-
36
-
37
- $top = isset($_SESSION['top']) ? $_SESSION['top'] : NULL;
38
-
39
- $under = isset($_SESSION['under']) ? $_SESSION['under'] : NULL;
40
-
41
-
42
-
43
- //postを受け取った場合
44
-
45
- if (!empty($_POST)) {
46
-
47
-
48
-
49
- // $_POST['top']の確認及びCSRF対策用の固定トークンが一致するか確認
50
-
51
- if (isset($_POST['top'], $_SESSION['ticket']) && hash_equals($_POST["ticket"], $_SESSION["ticket"])) {
52
-
53
-  //trueの場合、エスケープしてセッションに格納
54
-
55
- $_SESSION["top"] = h($_POST['top']);
56
-
57
- $top = $_SESSION["top"];
58
-
59
- }
60
-
61
-
62
-
63
- // $_POST['top']の確認及びCSRF対策用の固定トークンが一致するか確認
64
-
65
- if (isset($_POST['under'], $_SESSION['ticket']) && hash_equals($_POST["ticket"], $_SESSION["ticket"])) {
66
-
67
- $_SESSION["under"] = h($_POST['under']);
68
-
69
- $under = $_SESSION["under"];
70
-
71
- }
72
-
73
- }
74
-
75
-
76
-
77
- // CSRF対策の固定トークンを毎回生成しセッション変数にトークンを代入
78
-
79
- $_SESSION['ticket'] = sha1(uniqid(mt_rand(), TRUE));
80
-
81
- $ticket = $_SESSION['ticket'];
82
-
83
-
84
-
85
- ?>
86
-
87
-
88
-
89
- <!doctype html>
90
-
91
- <head>
92
-
93
- <title>size測り方</title>
94
-
95
- </head>
96
-
97
-
98
-
99
- <body>
100
-
101
- //html内容は割愛
102
-
103
- </body>
104
-
105
- ```
106
-
107
- functions.php ↓
108
-
109
- ```ここに言語を入力
110
-
111
- <?php
112
-
113
- //エスケープ処理を行う関数
114
-
115
- function h($var)
116
-
117
- {
118
-
119
- if (is_array($var)) {
120
-
121
- //$varが配列の場合、h()関数をそれぞれの要素について呼び出す(再帰)
122
-
123
- return array_map('h', $var);
124
-
125
- } else {
126
-
127
- return htmlspecialchars($var, ENT_QUOTES, 'UTF-8');
128
-
129
- }
130
-
131
- }
132
-
133
- ```
134
-
135
-
136
-
137
- フォームの脆弱性に関する箇所のみまとめると
138
-
139
- **セッションハイジャック対策**
140
-
141
- ```ここに言語を入力
142
-
143
- session_regenerate_id(TRUE);
144
-
145
- ```
146
-
147
- **クリックジャッキング**
148
-
149
- ```ここに言語を入力
150
-
151
- header('X-FRAME-OPTIONS:DENY');
152
-
153
- ```
154
-
155
- **CSRF対策 固定トークンが一致するか確認**
156
-
157
- ```ここに言語を入力
158
-
159
- if (isset($_POST['top'], $_SESSION['ticket']) && hash_equals($_POST["ticket"], $_SESSION["ticket"])) {
160
-
161
- //trueの場合処理進める
162
-
163
- ```
164
-
165
- **エスケープ**
166
-
167
- ```ここに言語を入力
168
-
169
- $top = h($_POST['top']);
170
-
171
- ```
172
-
173
- **3桁以内の数字のみ入力可能、それ以外はエラー表示**
174
-
175
- ```ここに言語を入力
176
-
177
- if (!preg_match('/^([0-9]{1,3})$/', $top)) {
178
-
179
- $error['top'] = '3桁以内の数字で入力してください';
180
-
181
- }
182
-
183
- ```
184
-
185
-
186
-
187
- 秘密トークンの発行により外部ページのpostは受け取らない
188
-
189
- フォームへの入力は3文字が最大であり、エスケープ処理もしている。
31
+ **・フォームへの入力は3文字が最大であり、エスケープ処理もしている。**
190
32
 
191
33
 
192
34
 
@@ -194,11 +36,11 @@
194
36
 
195
37
 
196
38
 
197
- 少しで可能性のある脆弱性れば教えて頂きたいで
39
+ これ以外に考えられる脆弱性りまか?
198
40
 
199
41
 
200
42
 
201
- ECサイト内のプログラムなのでセキュリティには気を遣ってますので
43
+ ECサイト内のプログラムなのでセキュリティには気を遣ってます。
202
44
 
203
45
 
204
46
 

4

編集しました

2020/09/22 04:57

投稿

kkkkk13n
kkkkk13n

スコア14

test CHANGED
File without changes
test CHANGED
@@ -98,7 +98,7 @@
98
98
 
99
99
  <body>
100
100
 
101
-
101
+ //html内容は割愛
102
102
 
103
103
  </body>
104
104
 

3

必要のないコードを削除しました

2020/09/22 04:39

投稿

kkkkk13n
kkkkk13n

スコア14

test CHANGED
File without changes
test CHANGED
@@ -98,43 +98,7 @@
98
98
 
99
99
  <body>
100
100
 
101
- <form action="" method="POST">
101
+
102
-
103
- <div>
104
-
105
- //type="tel"、最大桁数をmaxlength="3"で最大3桁の数字を受け取る
106
-
107
- トップバスト: <input type="tel" maxlength="3" name="top" value="<?php echo h($top); ?>">
108
-
109
- </div>
110
-
111
- <div>
112
-
113
- アンダーバスト: <input type="tel" maxlength="3" name="under" value="<?php echo h($under); ?>">
114
-
115
- </div>
116
-
117
- <input type="hidden" name="ticket" value="<?php echo h($ticket); ?>">
118
-
119
- <input type="submit" value="送信">
120
-
121
- <div>
122
-
123
- </form>
124
-
125
- <div>
126
-
127
- <?php echo "あなたのトップバストサイズ: " . h($top); ?>
128
-
129
- </div>
130
-
131
- <div>
132
-
133
- <?php echo "あなたのアンダーバストサイズ: " . h($under); ?>
134
-
135
- </div>
136
-
137
- </div>
138
102
 
139
103
  </body>
140
104
 

2

タグを追加しました。

2020/09/22 04:39

投稿

kkkkk13n
kkkkk13n

スコア14

test CHANGED
File without changes
test CHANGED
File without changes

1

分かりやすく編集しました

2020/09/22 04:32

投稿

kkkkk13n
kkkkk13n

スコア14

test CHANGED
File without changes
test CHANGED
@@ -167,3 +167,75 @@
167
167
  }
168
168
 
169
169
  ```
170
+
171
+
172
+
173
+ フォームの脆弱性に関する箇所のみまとめると
174
+
175
+ **セッションハイジャック対策**
176
+
177
+ ```ここに言語を入力
178
+
179
+ session_regenerate_id(TRUE);
180
+
181
+ ```
182
+
183
+ **クリックジャッキング**
184
+
185
+ ```ここに言語を入力
186
+
187
+ header('X-FRAME-OPTIONS:DENY');
188
+
189
+ ```
190
+
191
+ **CSRF対策 固定トークンが一致するか確認**
192
+
193
+ ```ここに言語を入力
194
+
195
+ if (isset($_POST['top'], $_SESSION['ticket']) && hash_equals($_POST["ticket"], $_SESSION["ticket"])) {
196
+
197
+ //trueの場合処理進める
198
+
199
+ ```
200
+
201
+ **エスケープ**
202
+
203
+ ```ここに言語を入力
204
+
205
+ $top = h($_POST['top']);
206
+
207
+ ```
208
+
209
+ **3桁以内の数字のみ入力可能、それ以外はエラー表示**
210
+
211
+ ```ここに言語を入力
212
+
213
+ if (!preg_match('/^([0-9]{1,3})$/', $top)) {
214
+
215
+ $error['top'] = '3桁以内の数字で入力してください';
216
+
217
+ }
218
+
219
+ ```
220
+
221
+
222
+
223
+ 秘密トークンの発行により外部ページのpostは受け取らない
224
+
225
+ フォームへの入力は3文字が最大であり、エスケープ処理もしている。
226
+
227
+
228
+
229
+ 上記の点からphp初心者の私からすると脆弱性はないようにも思えるのですが、どうなんでしょうか?
230
+
231
+
232
+
233
+ 少しでも可能性のある脆弱性があれば教えて頂きたいです。
234
+
235
+
236
+
237
+ ECサイト内のプログラムなのでセキュリティには気を遣ってますので。
238
+
239
+
240
+
241
+ よろしくお願いします