皆さんこんにちは!
今日は台風の影響も無くなり比較的過ごしやすいですね!ポンコツエンジニアのGONです。
千葉で記録的な豪雨により被害が出ていますが皆さん大丈夫でしょうか。
来週から記録的な暑さになるみたいな予報もあるので気を付けていきましょう。
前回までに人生賭けた求人サービスを構築するために『PHP』『postgreSQL』『AWS』を選んだ理由や、
サービス名の由来、求職者様向け&企業様向け機能のご紹介、面談の採用確率UP方法、
『PHP』『postgreSQL』『AWS』の実機練習用サイトをご紹介させていただき、
さらに『SQL』『PHP』『AWS』の基本的な操作方法とセキュリティについて書かせていただきました。
今日は『PHP』のセキュリティ編第二弾としてトークンについて書かせていただきます。
PHPのセキュリティでは、用途によってトークンが違います。
| トークン | 用途 |
|---|---|
| CSRFトークン | 不正なフォーム送信を防ぐ |
| セッションID | ログイン状態を識別する |
| パスワードリセットトークン | パスワード再設定 |
| メール認証トークン | メールアドレス確認 |
| APIトークン | APIへのアクセス認証 |
PHPでいう「トークン」は、ユーザーが正規のページから送信したリクエストか
確認するためのランダムな秘密値として使うことが多いです。
特に重要なのが CSRFトークンです。
1. トークンを生成
session_start();
if (empty($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
random_bytes(32)で予測困難な値を作ります。
2. フォームに埋め込む
<input type="hidden"
name="csrf_token"
value="<?= htmlspecialchars(
$_SESSION['csrf_token'],
ENT_QUOTES,
'UTF-8'
) ?>">
<input type="text" name="name">
<button type="submit">保存</button>
csrf_token = ランダムな文字列
が一緒に送られます。
3. サーバー側で確認
update.phpでは、
session_start();
$token = $_POST['csrf_token'] ?? '';
if (
empty($_SESSION['csrf_token']) ||
!hash_equals($_SESSION['csrf_token'], $token)
) {
http_response_code(403);
exit('不正なリクエストです');
}
とします。
これで、
正しいトークン
↓
処理を実行
間違ったトークン
↓
403 Forbidden
となります。
なぜトークンが必要?
例えば攻撃者が、
のようなフォームを作ってユーザーに踏ませても、攻撃者は正規サイトのCSRFトークンを知りません。
そのため、
攻撃者
↓
不正なPOST
↓
csrf_token がない / 間違っている
↓
サーバーが拒否
となります。
基礎的はありますが、トークンの重要性を分かっていただけましたでしょうか。
これらを考慮して構築した求人サービスは以下になります。
企業の方、エンジニアの方に使っていただけると非常に喜びます。
▼求人マッチングサービス【ヴェテラン】
https://veteran-work.com/
「トークンって何?Cookieと何が違うの?」
など質問やご質問いただけまいたら喜んで答えさせていただきます。
本日もありがとうございました。
明日も頑張りましょう。