回答編集履歴

3

修正

2023/04/28 05:25

投稿

NKTIDKSG
NKTIDKSG

スコア679

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

修正

2023/04/28 05:24

投稿

NKTIDKSG
NKTIDKSG

スコア679

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

修正

2023/04/28 05:19

投稿

NKTIDKSG
NKTIDKSG

スコア679

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
+ ```