質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

2回答

738閲覧

CSRF対策のトークンの$_SESSIONがうまく受け取れないです

Zeroo

総合スコア11

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2019/05/24 14:13

CSRF対策のトークンの$_SESSIONがうまく受け取れません

現在、ユーザーの新規登録でCSRFの対策としてトークンを発行したりしているのですがなぜか受け取りがうまくいきません。

発生している問題・エラーメッセージ

これは一例です。

dJFdi0MSgRrdZMByfBNEZzVCgtE85SNb0gboUR2w4/w= O6mQVzRizLd3ZmXN4Mu+MjpGYv2aTJ68WQyYF/fGxCE=不正アクセスの可能性あり

該当のソースコード

registration_mail_form.html

PHP

1<?php 2require 'php/registration_mail_form.php'; 3echo $_SESSION["token"] . "<br>"; 4echo $token; 5?> 6<!DOCTYPE html> 7<html lang="ja"> 8 9<head> 10 <meta charset="utf-8"> 11 <link rel="stylesheet" href="css/reset.css"> 12 <link rel="stylesheet" href="css/style.css"> 13 <title>Findeeply</title> 14</head> 15 16<body class="body"> 17 <?php include($_SERVER['DOCUMENT_ROOT'] . '/Findeeply/inc/header.php'); ?> 18 <h1>メール登録画面</h1> 19 20 <form action="registration_mail_check.html" method="post"> 21 22 <p>メールアドレス:<input type="text" name="mail" size="50"></p> 23 24 <input type="hidden" name="token" value="<?=$token?>"> 25 <input type="submit" value="登録する"> 26 27 </form> 28</body> 29 30</html> 31

registration_mail_form.php

PHP

1<?php 2session_start(); 3 4header("Content-type: text/html; charset=utf-8"); 5 6//クロスサイトリクエストフォージェリ(CSRF)対策 7$_SESSION['token'] = base64_encode(openssl_random_pseudo_bytes(32)); 8$token = $_SESSION['token']; 9 10//クリックジャッキング対策 11header('X-FRAME-OPTIONS: SAMEORIGIN'); 12 13?>

registration_mail_check.html

php

1<?php 2require 'php/registration_mail_check.php'; 3echo $_SESSION["token"]; 4?> 5<!DOCTYPE html> 6<html lang="ja"> 7 8<head> 9 <meta charset="utf-8"> 10 <link rel="stylesheet" href="css/reset.css"> 11 <link rel="stylesheet" href="css/style.css"> 12 <title>Findeeply</title> 13</head> 14 15<body class="body"> 16 <?php include($_SERVER['DOCUMENT_ROOT'] . '/Findeeply/inc/header.php'); ?> 17 <h1>メール確認画面</h1> 18 19 <?php if (count($errors) === 0): ?> 20 21 <p><?=$message?></p> 22 23 <p>↓このURLが記載されたメールが届きます。</p> 24 <a href="<?=$url?>"><?=$url?></a> 25 26 <?php elseif(count($errors) > 0): ?> 27 28 <?php 29foreach($errors as $value){ 30 echo "<p>".$value."</p>"; 31} 32?> 33 34 <input type="button" value="戻る" onClick="history.back()"> 35 36 <?php endif; ?> 37</body> 38 39</html> 40

registration_mail_check.php

php

1<?php 2session_start(); 3echo $_SESSION["token"] . "<br>"; 4echo $_POST["token"]; 5header("Content-type: text/html; charset=utf-8"); 6 7//クロスサイトリクエストフォージェリ(CSRF)対策のトークン判定 8if ($_POST['token'] != $_SESSION['token']){ 9 echo "不正アクセスの可能性あり"; 10 exit(); 11} 12 13//クリックジャッキング対策 14header('X-FRAME-OPTIONS: SAMEORIGIN'); 15 16?> 17

補足情報

.htaccessでhtml内にPHPが書けるようにしています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

header関数の前に出力書いては行けません。
header()

覚えておいて頂きたいのは、header() 関数は、 通常の HTML タグまたは PHP からの出力にかかわらず、すべての実際の 出力の前にコールする必要があることです。

※低評価された方
直接解決につながるかどうかは別として質問者のコードに対する指摘は間違っていません。
低評価理由をコメントしてください

投稿2019/05/24 21:54

編集2019/05/27 02:43
m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

session_start()してないからでは?

apacheでphp動かしている事が前提の回答

質問者のセッションが保存されない理由として考えられるのはhttp通信を行っているにも関わらずsession.cookie_secureOnになっているから
今どきのphpはデフォルトでOn(WSL)
※但しマニュアルではOffと書いてある

解決策としてphp以外の事がよくわからない場合

<?php ini_set('session.cookie_secure', 0);

とphpの頭にセキュア属性を消す記述を書くこと

※apacheが分かる人はapacheかhtaccessでやりましょう。
※php.iniは極力変えない方針でOK

投稿2019/05/24 14:43

編集2019/05/25 04:12
hentaiman

総合スコア6415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zeroo

2019/05/24 14:46

includeしてsessionstartしてるので必要ないのではないでしょうか
hentaiman

2019/05/24 14:54

失礼ちゃんとみてなかった。パッと見で判断した。とりあえず各ファイルの先頭にsession_start()書くように変えてみたら?それで上手くいくならきっと今の書き方だとstartの前に見えない何かが出力されているんだ。
m.ts10806

2019/05/25 03:12

>.htaccessでhtml内にPHPが書けるようにしています。 上記のような対応をしたこともしようと思ったこともないのですが、 これが何かしら影響あるんじゃないかなーとぼんやり思うんですが(特にヘッダーとか)、hentaimanさんどう思いますか?
hentaiman

2019/05/25 03:49

mtsさんにコメントもらったのでローカルで確認してみました、結果を追記しますね。
m.ts10806

2019/05/25 04:19

検証ありがとうございます。 確かにcookie_secureを明示的にonにすると問題切り分けで進みそうですね
hentaiman

2019/05/25 04:25

そうですね。これで原因違ったらもう知らないです。 自分も含めてオレオレ証明書 or れっつえんくりぷと使ってhttpsのみで開発しちゃう人たちは気付かない問題ですね。気にしなくても問題起きないから気にする必要自体無いとはいえ、こういう事もあるんだな程度には知っとくと良い事かもしんないですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問