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

質問編集履歴

6

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

2020/09/22 05:21

投稿

kkkkk13n
kkkkk13n

スコア14

title CHANGED
File without changes
body CHANGED
@@ -2,15 +2,29 @@
2
2
 
3
3
  フォームは最大で3文字しか入力できません。
4
4
 
5
- 行った対策
5
+ **行った対策**
6
6
  0. CSRF対策(秘密トークンの発行)
7
+ ```ここに言語を入力
8
+ //トークン発行
9
+ $_SESSION['ticket'] = sha1(uniqid(mt_rand(), TRUE));
10
+
11
+ //post受け取り時にトークンの一致を確認
12
+ if (isset($_POST['under'], $_SESSION['ticket']) && hash_equals($_POST["ticket"], $_SESSION["ticket"])) {
13
+ //trueの場合進める
14
+ ```
7
- 0. セッションハイジャック
15
+ 2. セッションハイジャック
8
16
  0. エスケープ処理
9
17
  0. クリックジャッキング
10
18
  0. 数値のみ入力可能なバリデーション
19
+ ```ここに言語を入力
20
+ if (!preg_match('/^([0-9]{1,3})$/', $under)) {
21
+ $error['under'] = '3桁以内の数字で入力してください';
22
+ }
23
+ ```
11
24
 
12
- ※セキュリティの関係からコードは割愛してます。
13
25
 
26
+ ※セキュリティの関係からコードは割愛してる場合あります。
27
+
14
28
  **・秘密トークンの発行により外部ページのpostは受け取らない**
15
29
 
16
30
  **・フォームへの入力は3文字が最大であり、エスケープ処理もしている。**

5

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

2020/09/22 05:21

投稿

kkkkk13n
kkkkk13n

スコア14

title CHANGED
@@ -1,1 +1,1 @@
1
- 【PHP】作成したフォームに脆弱性がないか、アドバイスをして頂けませんか
1
+ 【PHP】作成したフォームに脆弱性がないか、アドバイスをして頂けませんか
body CHANGED
@@ -1,103 +1,24 @@
1
1
  二箇所の<input>内に数値を入力して、同一ページの下部にて与えられた数値を出力したいです。
2
2
 
3
- ECサイト内で動くプログラなので、脆弱性はできるだけ取り除きたい
3
+ フォームは最大3文字しか入力きません
4
4
 
5
+ 行った対策
6
+ 0. CSRF対策(秘密トークンの発行)
7
+ 0. セッションハイジャック
5
- size.php ↓
8
+ 0. エスケープ処理
6
- ```ここに言語を入力
9
+ 0. クリックジャッキング
7
- <?php
8
- session_start();
10
+ 0. 数値のみ入力可能なバリデーション
9
11
 
10
- //セッションIDを更新して変更(セッションハイジャック対策)
11
- session_regenerate_id(TRUE);
12
+ ※セキュリティの関係からコードは割愛してます。
12
13
 
13
- //他のページのiframe内に表示されないようにする
14
+ **・秘密トークン発行により外部ページのpostは受け取らない**
14
- header('X-FRAME-OPTIONS:DENY');
15
15
 
16
- //functions.php呼び出
16
+ **・フォームへ入力は3文字が最大であり、エスケープ処理もている。**
17
- require './libs/functions.php';
18
17
 
19
- $top = isset($_SESSION['top']) ? $_SESSION['top'] : NULL;
20
- $under = isset($_SESSION['under']) ? $_SESSION['under'] : NULL;
21
-
22
- //postを受け取った場合
23
- if (!empty($_POST)) {
24
-
25
- // $_POST['top']の確認及びCSRF対策用の固定トークンが一致するか確認
26
- if (isset($_POST['top'], $_SESSION['ticket']) && hash_equals($_POST["ticket"], $_SESSION["ticket"])) {
27
-  //trueの場合、エスケープしてセッションに格納
28
- $_SESSION["top"] = h($_POST['top']);
29
- $top = $_SESSION["top"];
30
- }
31
-
32
- // $_POST['top']の確認及びCSRF対策用の固定トークンが一致するか確認
33
- if (isset($_POST['under'], $_SESSION['ticket']) && hash_equals($_POST["ticket"], $_SESSION["ticket"])) {
34
- $_SESSION["under"] = h($_POST['under']);
35
- $under = $_SESSION["under"];
36
- }
37
- }
38
-
39
- // CSRF対策の固定トークンを毎回生成しセッション変数にトークンを代入
40
- $_SESSION['ticket'] = sha1(uniqid(mt_rand(), TRUE));
41
- $ticket = $_SESSION['ticket'];
42
-
43
- ?>
44
-
45
- <!doctype html>
46
- <head>
47
- <title>size測り方</title>
48
- </head>
49
-
50
- <body>
51
- //html内容は割愛
52
- </body>
53
- ```
54
- functions.php ↓
55
- ```ここに言語を入力
56
- <?php
57
- //エスケープ処理を行う関数
58
- function h($var)
59
- {
60
- if (is_array($var)) {
61
- //$varが配列の場合、h()関数をそれぞれの要素について呼び出す(再帰)
62
- return array_map('h', $var);
63
- } else {
64
- return htmlspecialchars($var, ENT_QUOTES, 'UTF-8');
65
- }
66
- }
67
- ```
68
-
69
- フォームの脆弱性に関する箇所のみまとめると
70
- **セッションハイジャック対策**
71
- ```ここに言語を入力
72
- session_regenerate_id(TRUE);
73
- ```
74
- **クリックジャッキング**
75
- ```ここに言語を入力
76
- header('X-FRAME-OPTIONS:DENY');
77
- ```
78
- **CSRF対策 固定トークンが一致するか確認**
79
- ```ここに言語を入力
80
- if (isset($_POST['top'], $_SESSION['ticket']) && hash_equals($_POST["ticket"], $_SESSION["ticket"])) {
81
- //trueの場合処理進める
82
- ```
83
- **エスケープ**
84
- ```ここに言語を入力
85
- $top = h($_POST['top']);
86
- ```
87
- **3桁以内の数字のみ入力可能、それ以外はエラー表示**
88
- ```ここに言語を入力
89
- if (!preg_match('/^([0-9]{1,3})$/', $top)) {
90
- $error['top'] = '3桁以内の数字で入力してください';
91
- }
92
- ```
93
-
94
- 秘密トークンの発行により外部ページのpostは受け取らない
95
- フォームへの入力は3文字が最大であり、エスケープ処理もしている。
96
-
97
18
  上記の点からphp初心者の私からすると脆弱性はないようにも思えるのですが、どうなんでしょうか?
98
19
 
99
- 少しで可能性のある脆弱性れば教えて頂きたいで
20
+ これ以外に考えられる脆弱性りまか?
100
21
 
101
- ECサイト内のプログラムなのでセキュリティには気を遣ってますので
22
+ ECサイト内のプログラムなのでセキュリティには気を遣ってます。
102
23
 
103
24
  よろしくお願いします

4

編集しました

2020/09/22 04:57

投稿

kkkkk13n
kkkkk13n

スコア14

title CHANGED
File without changes
body CHANGED
@@ -48,7 +48,7 @@
48
48
  </head>
49
49
 
50
50
  <body>
51
-
51
+ //html内容は割愛
52
52
  </body>
53
53
  ```
54
54
  functions.php ↓

3

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

2020/09/22 04:39

投稿

kkkkk13n
kkkkk13n

スコア14

title CHANGED
File without changes
body CHANGED
@@ -48,25 +48,7 @@
48
48
  </head>
49
49
 
50
50
  <body>
51
- <form action="" method="POST">
51
+
52
- <div>
53
- //type="tel"、最大桁数をmaxlength="3"で最大3桁の数字を受け取る
54
- トップバスト: <input type="tel" maxlength="3" name="top" value="<?php echo h($top); ?>">
55
- </div>
56
- <div>
57
- アンダーバスト: <input type="tel" maxlength="3" name="under" value="<?php echo h($under); ?>">
58
- </div>
59
- <input type="hidden" name="ticket" value="<?php echo h($ticket); ?>">
60
- <input type="submit" value="送信">
61
- <div>
62
- </form>
63
- <div>
64
- <?php echo "あなたのトップバストサイズ: " . h($top); ?>
65
- </div>
66
- <div>
67
- <?php echo "あなたのアンダーバストサイズ: " . h($under); ?>
68
- </div>
69
- </div>
70
52
  </body>
71
53
  ```
72
54
  functions.php ↓

2

タグを追加しました。

2020/09/22 04:39

投稿

kkkkk13n
kkkkk13n

スコア14

title CHANGED
File without changes
body CHANGED
File without changes

1

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

2020/09/22 04:32

投稿

kkkkk13n
kkkkk13n

スコア14

title CHANGED
File without changes
body CHANGED
@@ -82,4 +82,40 @@
82
82
  return htmlspecialchars($var, ENT_QUOTES, 'UTF-8');
83
83
  }
84
84
  }
85
- ```
85
+ ```
86
+
87
+ フォームの脆弱性に関する箇所のみまとめると
88
+ **セッションハイジャック対策**
89
+ ```ここに言語を入力
90
+ session_regenerate_id(TRUE);
91
+ ```
92
+ **クリックジャッキング**
93
+ ```ここに言語を入力
94
+ header('X-FRAME-OPTIONS:DENY');
95
+ ```
96
+ **CSRF対策 固定トークンが一致するか確認**
97
+ ```ここに言語を入力
98
+ if (isset($_POST['top'], $_SESSION['ticket']) && hash_equals($_POST["ticket"], $_SESSION["ticket"])) {
99
+ //trueの場合処理進める
100
+ ```
101
+ **エスケープ**
102
+ ```ここに言語を入力
103
+ $top = h($_POST['top']);
104
+ ```
105
+ **3桁以内の数字のみ入力可能、それ以外はエラー表示**
106
+ ```ここに言語を入力
107
+ if (!preg_match('/^([0-9]{1,3})$/', $top)) {
108
+ $error['top'] = '3桁以内の数字で入力してください';
109
+ }
110
+ ```
111
+
112
+ 秘密トークンの発行により外部ページのpostは受け取らない
113
+ フォームへの入力は3文字が最大であり、エスケープ処理もしている。
114
+
115
+ 上記の点からphp初心者の私からすると脆弱性はないようにも思えるのですが、どうなんでしょうか?
116
+
117
+ 少しでも可能性のある脆弱性があれば教えて頂きたいです。
118
+
119
+ ECサイト内のプログラムなのでセキュリティには気を遣ってますので。
120
+
121
+ よろしくお願いします