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

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

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

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

Q&A

解決済

3回答

3861閲覧

$_SERVER['HTTP_REFERER']がうまく値とマッチしない

yoshipu

総合スコア115

PHP

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

0グッド

0クリップ

投稿2016/10/11 04:51

編集2016/10/11 05:16
<?php session_start(); if($_POST['id'] == ID and $_POST['pass'] == PASSWORD){ require_once('session.php'); header('Location:kaiin_add.php'); exit; session.php-------------------------------------------- <?php session_start(); if($_SERVER['HTTP_REFERER'] == 'hogehoge_login.php'){ $_SESSION['login'] = 1; } if($_SESSION['login'] != 1){ header('Location:hogehoge_login.php'); exit; }

1.login.phpでIDとPASSが一致するとrequire_onceでsession.phpを読み込んで、
$_SESSION['login']に1を代入してから会員ページに飛ぶ
2.会員ページでは$_SESSION['login']に1が入っていないとlogin.phpに戻されるというようなことをしたいのですが、なぜかうまくいきません。
3.echoしてみると$_SESSION['login']に1が正常に入らないらしくすべてloginページに戻されてしまいます。

お知恵をおかしいただけないでしょうか?よろしくお願いいたします。

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

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

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

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

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

shi_ue

2016/10/11 05:19 編集

xxxx_session.php というファイルはありませんが、それが、下に書かれている、session.php のことですか?
yoshipu

2016/10/11 05:29 編集

すみません。ファイル名がおかしかったです。session.phpのことです。できましたらxxxxという記述を追加・修正コメントから消していただくかhogeにしていただけないでしょうか。
shi_ue

2016/10/11 05:29

伏字にしました。あなたのコメントも伏字にしましょう(笑)
yoshipu

2016/10/11 05:32

すみません。こちらも伏字ではありませんでした。ご指摘いただきましてありがとうございます。
guest

回答3

0

ブラウザの種類等分かりませんが・・・
恐らく比較文字列側に問題があるかと思います。

var_dump等で比較する直前に$_SERVER['HTTP_REFERER']を出力してみて下さい。

session_start(); echo '<pre>'; var_dump($_SERVER['HTTP_REFERER']); echo '</pre>'; if($_SERVER['HTTP_REFERER'] == 'hogehoge_login.php'){ $_SESSION['login'] = 1; }

また、HTTP_REFERERにはユーザーが利用しているブラウザからの情報が入ります。
ですので、ユーザーのブラウザ設定にてリファラを許可していることが前提になります。
また、偽装や加工も出来る情報ですのでログイン等に使うのであればご注意を。

既にご存知でしたらすみません。

投稿2016/10/11 05:40

nobinobi

総合スコア199

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

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

yoshipu

2016/10/11 05:56

xamppでローカルでやっているのですが、ローカルのパスが出てしまいしまして、本番環境では、このパスではできませんでした。 ほかの手を考えようと思います。
yoshipu

2016/10/11 06:09

ほかに方法がありますでしょうか?
guest

0

ベストアンサー

session.phpはrequireされているだけなので、リファラーは入りませんよ?
むしろ$_SERVER['SCRIPT_NAME']あたりでrequire元を判断するのがよろしいかと。

php

1if($_SERVER['SCRIPT_NAME'] == '/hogehoge_login.php'){ 2 $_SESSION['login'] = 1; 3}

###追記
requireされているとすると、session_startが二回呼ばれるのも気になります。警告が出ているはずです。

php

1// session.php 2if (session_status() == PHP_SESSION_DISABLED) { 3 session_start(); 4} 5```などとして、Sessionが開始していないときだけ開始してください。 6 7###さらに追加 8```php 9$path_info = pathinfo($_SERVER['SCRIPT_NAME']); 10 11if ($path_info['filename'].'.'.$path_info['extension'] == 'hogehoge_login.php') { 12 //... 13```とすれば、一応パスは考えなくて良くなりますよ。

投稿2016/10/11 05:17

編集2016/10/11 06:18
shi_ue

総合スコア4437

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

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

yoshipu

2016/10/11 06:08

if($_SERVER['SCRIPT_NAME'] == '/hogehoge_login.php'){ の'/hogehoge_login.php'がローカルパスが出てしまい、本番環境では、これではうまくいかないと思い、別の手を考えようと思います。
yoshipu

2016/10/11 06:10

ほかに方法がありますでしょうか?
yoshipu

2016/10/11 06:26

ありがとうございました。
guest

0

$_SERVER['HTTP_REFERER']の中身を出力してみて、何が入っているか確認してみてください。
http://example.com/login.php
のような、プロトコル指定含む完全なURLが返ってくるはずですので、単純に「login.php」では一致しないはずです。

投稿2016/10/11 05:09

kunai

総合スコア5405

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

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

kunai

2016/10/11 06:20

他の回答へのコメントを見る限り、全体一致で確認が出来ないのであれば、正規表現で部分一致させればよいのではないかと思いました。 preg_match("/\/login\.php$/iu", $_SERVER['HTTP_REFFERER']); ※login.phpの部分を、実際にマッチさせるパス名に書き換えてください
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問