2018年8月19日日曜日

phpの勉強

必要になったので、CookieとかSessionに関する部分まで確認することをが目標。


* phpって何
PHP: Hypertext Preprocessorの略で、サーバサイドで動的なWebページを作るための色々を担う物、くらいの認識。
とりあえず基本的に「.php」にアクセスしても基本的には「.php」に記述したコードは表示されない(そのコードによって生成されたhtmlが表示される)ということっぽい。

 * 環境構築
 XAMPPが手元にあったのでそのまま流用。(XAMPPディレクトリ)/htdocsにphpinfo();を含むコードを書いて、ブラウザからアクセス。きちんと「phpinfo()によって生成されたhtml」が出力されていることを確認。

* モジュール版とCGI版
PHPの動作環境にはモジュール版とCGI版というものがあるそう。どうやらphpを誰が実行するかみたいなところで違いがあるようです。



XAMPPはコントロールパネルからクリックだけでhttpd.confにアクセスできるので手早い。
実行結果を見れば、一応変化は確認可能。











CGI版と言えばApache Magicaで有名なCVE-2012-1823があるので試したかったのですが、影響を受けるPHPから程遠い上にダウングレードちょっと面倒だなになったので後回しにします。
以下はモジュール版のままで作業継続。

* サーバサイドでそれっぽいコードを書く
phpマニュアル(http://php.net/manual/ja/tutorial.forms.php)を参考にhtmlで用意したフォームを処理するやつを作ってみます。

- フォーム表示
 <html>
  <title>test</title>
  <form action="res.php" method="post">
    name: <input type="text" name="name" />
    age : <input type="text" name="age" />
    <input type="submit" />
  </form>
</html>

 
 とても分かりやすい。


- フォーム処理(res.php)
<html>   
   <title>実行結果</title>
   名前
   <?php
    echo $_POST['name'];
   ?>
   <br />
   年齢
   <?php
    echo $_POST['age'];
    ?>
</html>
 
 とりあえずできた。

form.htmlで投げたPOSTの値は$_POST[]で取り出せることを確認。ただしこれだと<script>とか入ってしまうのでhtmlspecialcharsなどによるサニタイジングが必須ですね。
$_POSTはPHP側で設定してくれる値のようです。POSTで送られているので$_POSTであって、GETなら$_GETで取り出せるようです。このあたりはスーパーグローバル、自動グローバル変数と呼ばれるようで、スクリプト全体を通してアクセスできるようです。




* cookieの設定とか
HTTPは「ステートレス」なプロトコルなので、状態の保持ができません。ということでその辺りの情報処理に使われるのがcookieですね。
以下のようなシステムを作ってみます。

1. login.php: 初回アクセスかどうかを判定し、初回なら登録フォームへ飛ばす、そうでないならcookieに登録された名前を表示
2. nologin.html+setcookie.php: フォームに名前を登録させ、その名前をcookieとして与える
(かなりやばそう)

とりあえず作って、期待通りの動作を確認。firefoxのヘッダを見てcookieが存在していることをチェック。



そしてリクエストヘッダを編集して送信すれば簡単に変更できることも確認。
 

 ついでにcookieの中身を確認しようかと思ったのですが、firefoxはcookieをSOLiteで管理しているらしいのでやめました。


* セッション管理
 ユーザの状態識別をする為に使うcookieは、値を直接送受信する為容易に改ざん可能。この問題を解決するのがセッションidを利用した処理です。
クライアントに一意のidを設定し、そのidに紐づける形で状態をサーバ内で管理する、みたいな。idについてはcookieに乗せたり、URLにつけたり、フォームでの送信時に不可したりと色々ある様子。
 今回はcookieに乗せる方法でセッション処理をしてみます。

<?php
    session_start();
    if(isset($_SESSION["count"])){
        echo "id:";
        echo session_id();
        $_SESSION["count"]=$_SESSION["count"]+1;
        echo " welcome back! :";
        echo $_SESSION["count"];
    }else{
        $_SESSION["count"]=0;
        echo session_id();
        echo " welcome!";
    }
?>

 こんな感じでアクセス。初回アクセスであればidを表示して終了。二回目以降ではセッション変数に記録されたcountを呼び出したり処理したりします。

 
 初回アクセスに対して、idがset-cookieの形で突っ込まれています。ここで使われているのはPHPSESSIDですが、こちらはphp.iniのsession.nameで変更できるようです。
 
 ここでcookieの値を既存の別セッションにあてると、簡単に乗っ取りが成功します。
 
また、今回書いているコード的には、存在しないidを入力すると新規扱いになります。

* sessionの管理場所
セッションidに紐づいたデータはサーバ内に保存されます。実際にはファイルの形で管理されているらしいのでphpinfo()から確認できるsession.save_pathを確認してみます。


今回はxampp/tmpに入っていました。そのうちひとつの中身を開いてみると「count|i:0;」となっており、シリアライズされた形でデータが保持されていることを確認しました。

* まとめ
とりあえず確認行為が終了したので満足しました。

0 件のコメント:

コメントを投稿