SessionとCookieについて
「sessionとcookieってなんぞや!」というわけで今回はこのテーマ。
・xamppでPHPのインフォメーションを表示する
①C - xampp - htcdocsの中に「web1110」フォルダーを作る。
②「web1110」フォルダの中に「index.php」を作る。
③xamppのapacheをスタートする。
Visual Studio Codeで「index.php」を開き、
下記を入力
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>security</title>
</head>
<body>
おーい
</body>
</html>
<?php
phpinfo();
?>
ここでブラウザで「localhost/web1110/index.php」を見るとこうなる。
・PHPのInfomationと、HTMLの「おーい」が表示されている。
・PHPを省略して書く方法(余談)
ここで余談ですが、PHPは省略して書くことができる。
そういう場合はどうすればよいか。
・「Ctrl+F」で「short」を検索する。
・「short_open_tag」がOffになっている。
「short_open_tag」をOnにすると省略して書くことができるようになる。
変更箇所、C - xampp - phpの中の「php.ini」
メモ帳で「php.ini」を開く。
「short」で検索し、「short_open_tag=Off」を ➡「short_open_tag=On」に変更する。
※即時対応しないので注意。apacheをstopして再度startしてから確認する。
ブラウザで「localhost/web1110/index.php」を確認。⇩Onになっている。
省略してもいけるかどうか試してみるといけました。
(確認しただけなのでOffに戻しておきました。)
・localhostについて
VirtualBoxで作ったPHPを確認する際、ブラウザで「localhost/web1110/index.php」を入力して確認していますが、
実は自分の「固定IP/web1110/index.php」でも確認できる。
更に「127.0.0.1/web1110/index.php」でも確認できる。
下記参照。
なぜか。それはhostsというもので紐づけされているからです。
・hostsとは
hostsファイルとは、ドメインとIPアドレスの紐づけルールがかかれているものです。ちなみにhostsの場所は、自分のパソコンの「Cドライブ- Windows - System32 - drivers - etc - hosts」に存在する。
メモ帳でひらくとこんな感じ。ここで紐づけされているから同じものを見に行くようです。
ちなみに「127.0.0.1」と「::1」の違いは👇こういうことらしい。
・hostsファイルの書き方
IPアドレス+Tabキー+ドメイン(118.151.233.191 example.com)
注)そのまま保存できない。デスクトップに移動して変更した後、元の位置に戻す。
こう書くとexample.comと118.151.233.191が紐づく。
・PHPで入力フォームを作る
sessionを確認するために、まずこういう入力フォームをつくる。
<?php
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>登録</title>
</head>
<body>
<h1>登録</h1>
<form action="confirm.php" method="post">
<p>
氏名:<input type="text" name="namae">
</p>
<p>
フリガナ:<input type="text" name="kana">
</p>
<p>
住所:<input type="text" name="address">
</p>
<p>
電話:<input type="text" name="tel">
</p>
<p>
メール:<input type="text" name="email">
</p>
<input type="submit" name="send" value="送信">
</form>
</body>
</html>
送信を押すと(comfirm.php)に移動するようにしたい。
ここで注意することは、送信は「button」を使ってはいけない。ただの問い合わせのフォームに移動するボタンなどは使ってよいが、データを送るときは「submit」を使うこと!ポイント!
・送信ボタンを押すと移動するページを作る
「comfirm.php」を作る。
◆session_start();はphpでsessionを管理をスタートするという定型文
◆issetは()の中の変数に値がセットされていて、かつNULLでないときに、TRUE(真)とする関数
<?php
session_start();
if(isset($_POST)){
$post = $_POST;
}
if(isset($_POST)){
$_SESSION['person']=$post;
echo "送信されました";
}else{
$_SESSION['person']=array();
echo "送信されませんでした";
}
?>
ブラウザ上で入力して送信ボタンを押すと、comfirm.phpで設定した表示(送信されました)が出ました。
うまくいったものの入力した情報がどうなっているのかは、この状態では確認できない。ちゃんと入力したものが引き継ぎされているか確認できるように「var_dump」を入れる。
<?php
session_start();
if(isset($_POST)){
$post = $_POST;
}
if(isset($_POST)){
$_SESSION['person']=$post;
echo "送信されました";
}else{
$_SESSION['person']=array();
echo "送信されませんでした";
}
var_dump($_SESSION['person']);
?>
入力して送信ボタンを押すと、
でました。きちんと入力した情報が引き継がれているようです。
次に条件を付けました。
◆countは()内の文字数を数える関数
<?php
session_start();
if(isset($_POST) && count($_POST) > 0){
$post = $_POST;
}
if(isset($_POST)){
$_SESSION['person']=$post;
echo "送信されました";
}else{
$_SESSION['person']=array();
echo "送信されませんでした";
}
var_dump($_SESSION['person']);
?>
ちゃんと表示されています 。
・Session(セッション)とは
セッションとは、サーバー側に一時的にデータを保存する仕組みのことで、
Web上でのログイン情報や最終アクセスなど、ユーザーに直接紐づくようなデータをセッションに格納して使う。
Cookieの仕組みに似ていますが、
・Cookie(クッキー)はブラウザ側・Session(セッション)はサーバー側
とデータの保存場所が異なります。
◆Cookieはブラウザ側に保存されるという性質上、ユーザーがデータを改ざんすることもできる。
・隣のパソコンの、「入力フォーム・入力後の情報」が自分のパソコンから見えるか。
別のパソコンで入力したindex.phpの入力が見えるか確認してみる。
「172.16.3.149/web1110/index.php」
普通に見える。
ここで入力したらconfirm.phpも見えるのか確認する。
見えてしまった。
危険!
SQLインジェクションなど仕掛けられたら、情報が抜き替えられたり書き換えられたりされてしまう。よそから来たものは受付ないようにしたい。
いや、しなければいけない。
・アクセスログの確認
ここで、xampp(サーバー)のログがどうなっているか確認してみます。
access.logをメモで開いて、一番最後を見る。
別の端末(172.16.3.149)からのアクセスがあるのがわかる。
因みに、
localhostでみたものは「::1」と表示。
172.16.3.115でみたものは「172.16.3.115」と表示されている。
172.16.3.149から入力されたものはきちんとログで残っていました。
・リファラーチェックとは
スパム対策として、フォームの送信がどのURLから行われたか(リファラー)をチェックし、プログラム上(PHP)で見知らぬURLからの送信は除外することができる。先ほどの式に下記を追加する。
if($_SERVER['HTTP_REFERER'] != "http://localhost/web1110/);
↑リファラーがlocalhostからでない場合
「$_SERVER['HTTP_REFERER']」
↑これは直前のURL(リファラー)を取得するものです。
もし直前のリファラーがlocalhostのindexからではない場合、comfirm.phpではなくindex.phpに移動する。
・リファラを見ることで、ユーザーがどのような経路でサイトに流入しているかを知ることができる。
・Cookie(クッキー)とは
・Cookie(クッキー)とはCookieとは、パソコンのブラウザ側に一時的にデータを保存する仕組みのこと。
たとえば、よく訪問するWebサイトにログインするときにIDやパスワードが履歴として出てきたり、ネットショッピングでショッピングカートに入れたものが一定の期間だけ保存されていたりする。
これは、Cookieが働いているためです。
Cookieの確認できる場所は、ブラウザの右上のチョンチョンをクリックして、設定を選択する。
プライバシーセキュリティタグの、Cookieと他のサイトデータ➤をクリック
ここにCookieが入っている。誰かが使う可能性のあるパソコンはセキュリティ上ここは全部削除しておいた方が良いでしょう。
・SessionのCookie
Session情報はブラウザを閉じるとリセットされる。
AmazonなどのECサイトだと、閉じてもカートに物が残っている。残っていない方が困る。
どうなっているのかというと、Session情報は消えるが、DBに保存されているということらしい。IDとパスワードを入力するので安全に利用できるそうです。
・Cookie情報がない状態で、初めてSessionをした時にはどう表示されるか
①Cookieを全て削除します。
②ブラウザも閉じてsessionを切り、再度たちあげる。
<?php
session_start();
if($_SERVER['HTTP_REFERER'] != "http://localhost/web1110/");
if(isset($_POST) && count($_POST) > 0){
$post = $_POST;
}
if(isset($_POST)){
$_SESSION['person']=$post;
echo "送信されました";
}else{
$_SESSION['person']=array();
echo "送信されませんでした";
}
var_dump($_SESSION['person']);
?>
③入力フォームに入力して送信ボタンを押す。
④その時点で、ブラウザを右クリックして検証を開く。
⑤networkを選択。・・・何もでなかった。
でなかったらリロードすると出るらしい。出た。comfirm.phpをクリック
Headerを確認する。CookieがなくなっているのでSet-Cookie:~と初めてCookieがセットされる表示が出る。
もしCookieが残っていたらどう表示されるか。
こんな感じ。
Response Headersの中にSet-Cookieはなく、
Request HeadersにCookie情報が表示される。
・キャッシュがある場合、tmpログとの整合性は?
サーバーの「C - xampp - tmp」の中を確認すると
confirm.phpのNerworkのCookiesに残っているものを比べると、値が同じものがあった。この値は一意なものとして残る。パソコンでCookieを削除したとしてもサーバーにはログがしっかり残っていることが確認できた。
このログの中身をみてみる。メモ帳で開く。
先ほど入力した値が残っている。なんということでしょう!
サーバーの中に入られてしまうと、入力した情報を盗まれたり改ざんされてしまう!恐ろしい。
・Cookieが残っているかさらに確認する
新しくmypage.phpを作成する
表示してみると先ほど入力した情報がでた。
検証で確認してみると、Cookie情報が残っていた為、ちゃんと表示されたことがわかる。これは端末自体にに保存されている情報なので、違うパソコンからは見えない。
今日はここまで!
なにとぞ なにとぞー