Posted by & filed under diary, programming.


今やってる学校の実験の内容は、ウェブアプリケーションの作成。PHPとMySQLが出てくる。

PHPとか高校時代にさわったきりなので、結構いろいろ忘れてる。

高校時代から何の進歩もないのも嫌なので、Cookieとかセッションも扱えるように勉強を始めた。

今回のウェブアプリケーションの実験は、セキュリティの勉強も兼ねているので、そのあたりも一緒に勉強しないとならない。

いろんなサイトを巡って情報を集めて、とりあえず簡単なログインシステムっぽいのを作ってみた。

  • func.php – 関数定義
    <?php
    	/**
    	 * secure_session_start()
    	 * セッションを開始する
    	 * @param void
    	 * @return void
    	 */
    	function secure_session_start() {
    		// セッションIDを推測されにくいユニークなものに設定
    	/*	mt_srand(microtime()*10000);
    		session_id(md5(uniqid(mt_rand(),1)));*/
    		// セッション名を設定
    		session_name('kakeibo');
    		// セッションの持続時間を30分に設定
    		session_set_cookie_params(1800);
    		// セッションを開始する
    		session_start();
    		// Session Fixation攻撃対策
    		if(!isset($_SESSION['initiated'])){
    			session_regenerate_id(true);
    			$_SESSION['initiated'] = true;
    		}
    	}
    
    	/**
    	 * session_end
    	 * セッションを破棄する
    	 * @param void
    	 * @return void
    	 */
    	function session_end() {
    		// セッション変数を初期化
    		$_SESSION = array();
    		// Cookieを削除
    		if(isset($_COOKIE[session_name()])){
    			setcookie(session_name(), '', time()-42000, '/');
    		}
    		// セッションファイルを削除
    		session_destroy();
    	}
    ?>
    
  • login.php – ログインページ
    <?php
    	include('config.php');
    	include('func.php');
    
    	secure_session_start();
    
    	if(isset($_POST['pass'])){
    		if($_POST['pass'] == USER_PASS){
    			$_SESSION['logged_in'] = true;
    			session_regenerate_id(true);
    			header("Location: ./ok.php");
    		}
    	}
    ?>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Login</title>
    </head>
    <body>
    <h3>ログイン</h3>
    <form action="login.php" method="post">
    	<input type="password" name="pass" value="" size="20" maxlength="20">
    	<input type="submit" value="OK">
    </form>
    ※<?php echo $_SERVER["SERVER_NAME"]; ?>からのCookieを受けつけるように設定してください。
    </body>
    </html>
    
  • ok.php – ログインした後にしか見られない専用ページ
    <?php
    	include('func.php');
    
    	secure_session_start();
    
    	if($_GET['mode'] == "logout"){
    		session_end();
    	}
    
    	if(!isset($_SESSION['logged_in'])){
    		header("Location: ./login.php");
    	}
    ?>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>OK</title>
    </head>
    <body>
    <h2>ログインOK!</h2>
    <form action="ok.php" method="get">
    	<input type="hidden" name="mode" value="logout">
    	<input type="submit" value="Logout">
    </form>
    </body>
    </html>
    

実際に設置したログインページはここ。専用ページはここ。パスワードは’pass’.

ログインしていない状態で専用ページを表示しようとすると、自動的にログインページにリダイレクトされる。

一度ログインすると、30分以上アクセスしないか、Cookieを削除しない限り、ブラウザを閉じたり、キャッシュを消したりしても問題なく表示される。

こうやってうまくいくと、新しいことを勉強するのも楽しい。次はGDライブラリの使い方とか勉強してみようか…

  • ちなみにパスワードは「pass」