PHPプログラミング診断室

第5回 永遠のPHP 4(診断編)

この記事を読むのに必要な時間:およそ 5.5 分

めっきり寒い毎日ですが,皆さんいかがお過ごしでしょうか。1月はあっという間に終わってしまい,2月に突入しました。2月は逃げる,3月は去ると言いますが,時間が過ぎる速度が年々増しているような気がする今日このごろです。春は早く来てほしいのですが,時間が過ぎ去ってしまうのは寂しいものです。

きみ,それPHP 4やで

すっかり感傷にふけったところで,診断のお時間です。今回のコードは2004年に書かれたものです。2004年といえばPHP 4真っ盛りの時代ですね。年代もののコードを扱うことが多い本連載ですが,このコードは今も現役で(PHP 4環境で!)稼働しているというのがこれまでと違う点です。えー,わかります,言いたいことはわかります。PHP 4は,もはやメンテナンスが行われていないので,もしセキュリティホールがあったとしても,どうしようもありません。攻撃され放題です。早急にPHP 5へのアップグレードを行っていただきたいところです。

今回は,PHP 5にアップグレードするにあたって,このコードをどう変えていくのがよいか,という視点で診断を行ってみます。

診断するのはログイン処理を行うlib/Login.phpcontroller/LoginController.phpの2ファイルです。では,PHP 4ながら現役バリバリのコードを見てみましょう。さあ,お入りください。

controller/LoginController.php

<?php
require_once('lib/BasicController.php');
require_once('lib/CheckExecuter.php');
require_once('lib/Login.php');
require_once('model/UserModel.php');

define_once('LOGIN_ID',  'login_id');
define_once('PASSWORD',     'password');

/**
 * <b>LoginController</b>
 * ログインコントローラ
 *
 * @author hoge
 * @version $Id: LoginController.php,v 1.1.1.1 2004/10/01 08:46:04 hoge Exp $
 */
class LoginController extends BasicController {
  var $NEXT_PAGE = 'top.php';

  /**
   * コンストラクタ
   *
   * @param $values 値連想配列(フォームからの入力の際は,$_POST)
   */
  function LoginController() {
    $this->init();

    // セッションクリア
    unset($_SESSION[SESSION_USER]);

    if (Http::isPost()) {
      $this->values = $_POST;
    } else {
      $this->values = null;
    }
  }

  /**
   * メイン処理
   */
  function execute() {
    if (Http::isPost()) {
      // 値チェック
      $checker = new CheckExecuter($this);
      $checker->check();
      $this->errorMessages = $checker->getErrorMessages();

      // 正常なら処理を行う
      if (!$this->isError()) {
        // セッションクリア
        $_SESSION = array();

        // ログイン処理
        $userModel = new UserModel();
        $userModel->setLoginId($this->values[LOGIN_ID]);
        $userModel->setPassword($this->values[PASSWORD]);
        if (Login::auth($userModel)) {
          unset($_SESSION[SESSION_USER]);
          $_SESSION[SESSION_USER] = $userModel;

          // 次ページへ
          $this->transferPage($this->NEXT_PAGE);
        } else {
          $this->addErrorMessage('error_not_login');
          return;
        }
      }
    }
  }

  /**
   * ログインIDチェック
   */
  function checkLoginId() {
    if (isset($this->values[LOGIN_ID])
      && $this->values[LOGIN_ID]) {
      return null;
    }
    else {
      return "check_login_id";
    }
  }

  /**
   * ログインIDチェック
   */
  function checkLoginId() {
    if (isset($this->values[LOGIN_ID])
      && $this->values[LOGIN_ID]) {
      return null;
    }
    else {
      return "check_login_id";
    }
  }

  /**
   * パスワードチェック
   * 半角英数8桁以内
   */
  function checkPassword() {
    if (isset($this->values[PASSWORD])
       && $this->values[PASSWORD]
       && ereg('^[a-zA-Z0-9]+$', $this->values[PASSWORD])
       && strlen($this->values[PASSWORD]) <= 8) {
      return null;
    }
    else {
      return "check_password";
    }
  }
}
?>

lib/Login.php

<?php
require_once('lib/Log.php');
require_once('lib/Database.php');

/**
 * <b>Login</b>
 * ログインクラス
 * ログイン管理を行う
 *
 * @author hoge
 * @version $Id: Login.php,v 1.1.1.1 2004/10/01 08:46:04 hoge Exp $
 */
class Login {
  /**
   * コンストラクタ
   */
  function Login() {
  }

  /**
   * 認証
   *
   * @param &$userModel ユーザ情報Model
   *                   IdCardNoとPasswordをセットしておく
   * @return 認証OKならtrue
   *         エラーならfalse
   */
  function auth(&$userModel) {
    if (get_class($userModel) != 'usermodel') {
      return false;
    }

    $handleName = addslashes($userModel->getHandleName());
    $password = addslashes($userModel->getPassword());
    $where = sprintf('handle_name=\'%s\' and password =\'%s\'', $handleName, $password);

    $db =& Database::getInstance();
    if (($record = $db->getOneRecord('*', 'v_user', $where))) {
      // ユーザ情報をセット
      $userModel->setId($record['id']);
      $userModel->setIdCardNo($record['id_card_no']);
      $userModel->setEmail($record['email']);
      $userModel->setFirstName($record['first_name']);
      $userModel->setLastName($record['last_name']);
      $userModel->setFirstNameKana($record['first_kana']);
      $userModel->setLastNameKana($record['last_kana']);
      $userModel->setPrefecture($record['prefecture']);
      $userModel->setAddress($record['address']);
      $userModel->setSubAddress($record['sub_address']);
      $userModel->setZip($record['zip']);
      $userModel->setTel($record['tel']);
      $userModel->setBirthdayYear($record['birthday_year']);
      $userModel->setBirthdayMonth($record['birthday_month']);
      $userModel->setBirthdayDay($record['birthday_day']);
      $userModel->setLangCode($record['lang_code']);

      return true;
    } else {
      return false;
    }
  }
}
?>

著者プロフィール

新原雅司(しんばらまさし)

1×1株式会社 代表取締役

大阪でPHPを駆使してWebシステムの開発を行う日々。MotoGPをこよなく愛す。愛車はPCX。

Twitter:shin1x1
blog:Shin x blog

コメント

コメントの記入