質問編集履歴
6
分かりやすく編集しました
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
|
-
|
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
セキュリティ的に公開したくないコードがあった
title
CHANGED
@@ -1,1 +1,1 @@
|
|
1
|
-
【PHP】作成したフォームに脆弱性がないか、アドバイスをして頂けませんか
|
1
|
+
【PHP】作成したフォームに脆弱性がないか、アドバイスをして頂けませんか
|
body
CHANGED
@@ -1,103 +1,24 @@
|
|
1
1
|
二箇所の<input>内に数値を入力して、同一ページの下部にて与えられた数値を出力したいです。
|
2
2
|
|
3
|
-
|
3
|
+
フォームは最大で3文字しか入力できません。
|
4
4
|
|
5
|
+
行った対策
|
6
|
+
0. CSRF対策(秘密トークンの発行)
|
7
|
+
0. セッションハイジャック
|
5
|
-
|
8
|
+
0. エスケープ処理
|
6
|
-
|
9
|
+
0. クリックジャッキング
|
7
|
-
<?php
|
8
|
-
|
10
|
+
0. 数値のみ入力可能なバリデーション
|
9
11
|
|
10
|
-
//セッションIDを更新して変更(セッションハイジャック対策)
|
11
|
-
|
12
|
+
※セキュリティの関係からコードは割愛してます。
|
12
13
|
|
13
|
-
|
14
|
+
**・秘密トークンの発行により外部ページのpostは受け取らない**
|
14
|
-
header('X-FRAME-OPTIONS:DENY');
|
15
15
|
|
16
|
-
|
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
編集しました
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
必要のないコードを削除しました
title
CHANGED
File without changes
|
body
CHANGED
@@ -48,25 +48,7 @@
|
|
48
48
|
</head>
|
49
49
|
|
50
50
|
<body>
|
51
|
-
|
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
タグを追加しました。
title
CHANGED
File without changes
|
body
CHANGED
File without changes
|
1
分かりやすく編集しました
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
|
+
よろしくお願いします
|