回答編集履歴
3
修正
test
CHANGED
@@ -52,17 +52,6 @@
|
|
52
52
|
return $token;
|
53
53
|
}
|
54
54
|
|
55
|
-
//トークン発行
|
56
|
-
function get_token()
|
57
|
-
{
|
58
|
-
$time = time();
|
59
|
-
$id = uniqid();
|
60
|
-
$hash = md5($id . KEY . $time);
|
61
|
-
$token = $hash . '_' . $id . '_' . $time;
|
62
|
-
|
63
|
-
return $token;
|
64
|
-
}
|
65
|
-
|
66
55
|
//トークン認証
|
67
56
|
function auth_token($token)
|
68
57
|
{
|
2
修正
test
CHANGED
@@ -27,6 +27,8 @@
|
|
27
27
|
セキュリティ強度などは要調整。
|
28
28
|
|
29
29
|
```PHP
|
30
|
+
<?php
|
31
|
+
|
30
32
|
define("KEY", "test123"); //共通利用の鍵
|
31
33
|
define("EXPIRE", 60); //トークンの有効期限(秒)
|
32
34
|
|
@@ -42,9 +44,20 @@
|
|
42
44
|
//トークン発行
|
43
45
|
function get_token()
|
44
46
|
{
|
45
|
-
$time = time();
|
47
|
+
$time = time();
|
46
48
|
$id = uniqid();
|
47
|
-
$hash = md5($id . KEY . $time);
|
49
|
+
$hash = md5($id . KEY . $time);
|
50
|
+
$token = $hash . '_' . $id . '_' . $time;
|
51
|
+
|
52
|
+
return $token;
|
53
|
+
}
|
54
|
+
|
55
|
+
//トークン発行
|
56
|
+
function get_token()
|
57
|
+
{
|
58
|
+
$time = time();
|
59
|
+
$id = uniqid();
|
60
|
+
$hash = md5($id . KEY . $time);
|
48
61
|
$token = $hash . '_' . $id . '_' . $time;
|
49
62
|
|
50
63
|
return $token;
|
@@ -55,10 +68,12 @@
|
|
55
68
|
{
|
56
69
|
list($hash, $id, $time) = explode('_', $token);
|
57
70
|
|
71
|
+
//改竄検知
|
58
72
|
if ($hash !== md5($id . KEY . $time)) {
|
59
73
|
return false;
|
60
74
|
}
|
61
75
|
|
76
|
+
//有効期限確認
|
62
77
|
if ($time < (time() - EXPIRE)) {
|
63
78
|
return false;
|
64
79
|
}
|
1
修正
test
CHANGED
@@ -9,10 +9,9 @@
|
|
9
9
|
|
10
10
|
そもそもフォームと送信先のドメインが違うケース自体がイレギュラーですので、やり方は限られると思います。
|
11
11
|
|
12
|
-
### 案1
|
13
12
|
A = フォーム送信先
|
14
13
|
B = フォーム設置先
|
15
|
-
|
14
|
+
### 案1
|
16
15
|
A、Bのサーバサイドで同じ鍵により、生成と検証ができるトークンが前提。
|
17
16
|
|
18
17
|
1. Bでトークンを発行し、フォーム生成時に送信値としてFORMタグに含める。
|
@@ -22,3 +21,48 @@
|
|
22
21
|
BがPHPなどで作成できない場合は、
|
23
22
|
Aにトークンを発行するためのAPIを作成、ヘッダにAccess-Control-Allow-OriginでBのドメイン指定、
|
24
23
|
Bのフロントから非同期でそのAPIを叩き、フォームの送信値にセットするようにする。
|
24
|
+
|
25
|
+
### トークン生成と認証(簡易例)
|
26
|
+
入力値のエラーハンドリングなど不完全ですが、参考にはなると思います。
|
27
|
+
セキュリティ強度などは要調整。
|
28
|
+
|
29
|
+
```PHP
|
30
|
+
define("KEY", "test123"); //共通利用の鍵
|
31
|
+
define("EXPIRE", 60); //トークンの有効期限(秒)
|
32
|
+
|
33
|
+
//トークン取得
|
34
|
+
$token = get_token();
|
35
|
+
echo $token;
|
36
|
+
echo '<hr>';
|
37
|
+
|
38
|
+
//トークン認証
|
39
|
+
$auth = auth_token($token);
|
40
|
+
echo $auth ? 'OK' : 'NG';
|
41
|
+
|
42
|
+
//トークン発行
|
43
|
+
function get_token()
|
44
|
+
{
|
45
|
+
$time = time();
|
46
|
+
$id = uniqid();
|
47
|
+
$hash = md5($id . KEY . $time);
|
48
|
+
$token = $hash . '_' . $id . '_' . $time;
|
49
|
+
|
50
|
+
return $token;
|
51
|
+
}
|
52
|
+
|
53
|
+
//トークン認証
|
54
|
+
function auth_token($token)
|
55
|
+
{
|
56
|
+
list($hash, $id, $time) = explode('_', $token);
|
57
|
+
|
58
|
+
if ($hash !== md5($id . KEY . $time)) {
|
59
|
+
return false;
|
60
|
+
}
|
61
|
+
|
62
|
+
if ($time < (time() - EXPIRE)) {
|
63
|
+
return false;
|
64
|
+
}
|
65
|
+
|
66
|
+
return true;
|
67
|
+
}
|
68
|
+
```
|