Very Light Weight Frame work "Typon" proto type. | TheoryOfContraints official blog

Very Light Weight Frame work "Typon" proto type.

今、PHPでウェブのプログラムを作っているけど、作っているライブラリがコンパクト過ぎて。他の機能を仮組みで作って、テストもデバッグもしてないけれど、見せた方が面白そうなので見せてみる

 

動作テストもしてないので、このフレームワークを使わないで! 事故っても責任は取りませんよ

 

でも、これらの機能のみでもPHPのプログラムを動かせるよな、と実験的な試みです

 

ちゃんとテストできて確かめて動かせるなら、githubで上げ直しますので

 

とりあえず、ドメインなプログラミングなMVPパターンで組んでいて、HTMLテンプレートはSmartyで、パスワードのハッシュなどは別にLOGINドメインを作ってて、そこに置いてます

 

以上、暇潰し報告でした

 

------- 以下、ソースコード -------

<?php
    //     ヌルバイトアタック処理
    function sanitizer($array) {
        if (is_array($array)) {
            return array_map('sanitizer', $array);
        }
        return str_replace("\0", "", $array);
    }

    $_POST = sanitizer($_POST);
    $_COOKIE = sanitizer($_COOKIE);
    
    $exec = str_replace("\0", "", $_GET['exec']);
    $_GET = array(); // Delete gets.
    
    // mb Setting.
    mb_language("Japanese");
    mb_internal_encoding("UTF-8");
    
    // セッションIDリセット
    session_start();
    session_regenerate_id(true);    
    
    // プレゼンテーターネームチェック
    if ($exec == "") {
        // "/"なのでindexを実行
        $exec = "index";
    } elseif (!preg_match('/\A[a-zA-Z0-9\-\_]+\z/i', $exec)) {
        // 不正アクセスなのでログアウト
        STD::logout();
        exit;
    }
    
    // プレゼンテーターがあるか?
    if (! file_exists("frames/".$exec.".frame")) {
        if ($exec == "index") {
            // error.
            echo("Error: No thing [index].");
            exit;
        } else {
            // 不正アクセスなのでログアウト
            STD::logout();
            exit;
        }
    }
    
    // 実行
    require_once("frames/".$exec.".frame");
    exit;

class STR {    
    // 全角トリム
    function mbTrim($str) {
        $str = self::toUtf8($str);
        $str = preg_replace('/[\r\n]/u', '', $str);
        return preg_replace('/\A[\p{C}\p{Z}]++|[\p{C}\p{Z}]++\z/u', '', $str);
    }
    
    // UTF変換
    function toUtf8($str) {
        return mb_convert_encoding($str, "UTF-8", "auto");
    }
    
    // Nullバイト削除
    function nullDelete($str) {
        return str_replace("\0", "", $str);
    }
    
    // <br>変換
    function toBr($str) {
        $str = preg_replace('/\n\r/u', '\r\n', $str);
        $str = preg_replace('/\r\n/u', '\r', $str);
        $str = preg_replace('/\n/u', '\r', $str);
        $str = preg_replace('/\r/u', '<br>', $str);
        return $str;
    }
    
    function toRn($str) {
        $str = preg_replace('/<br>/u', '\r\n', $str);
        return $str;
    }

    function len($str) {
        return mb_strlen($str);
    }
    
    function empty($str) {
        return empty($str);
    }
    
    function htmlConvert($str) {
        return htmlspecialchars($str, ENT_QUOTES);
    }

    function checkUrl($str) {
        return preg_match('/\Ahttps?(:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)\z/', $str);
    }

    function checkPassword($str) {
        return preg_match('/\A[a-zA-Z0-9]+\z/i', $str);
    }

    function checkNumber($str) {
        return preg_match('/\A[0-9]+\z/i', $str);
    }
    
    function checkMail($str) {
        // https://gist.github.com/felds/864067
        $regexp = '/^(?:[a-z0-9!#$%\'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&\'*+\/=?^_`{|}'.
                '~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\['.
                '\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-'.
                '9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-'.
                '9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?'.
                '|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-' .
                '\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])$/';
        return preg_match($regexp, $str);
    }
}

class STD {
    // Loginセーブ
    function loginSave($userId) {
        $_SESSION['id'] = $userId;
        self::uidMake($userId);
    }
    
    // Loginチェック
    function loginCheck() {
        if (! uidCheck()) {
            self::logout();
            exit;
        }
    }

    // ログアウト
    function logout() {
        $_SESSION = array();
        session_destroy();
        header("Location: ./index");
    }
    
    // uID.
    function uidMake($user_id) {
        $_SESSION['uid'] = self::uidGet($user_id);
        return $_SESSION['uid'];
    }
    
    function uidCheck() {
        if (empty($_SESSION['uid']) || empty($_SESSION['id'])) {
            return false;
        } elseif (self::uidGet($_SESSION['id']) == $_SESSION['uid']) {
            return true;
        }
        return false;
    }

  
    function uidGet($user_id) {
        $str = $user_id."nje4HDa"; // ジャミング
        
        // ブラウザー情報など
        if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
            $str .= $_SERVER['HTTP_X_FORWARDED_FOR'];
        } else {
            $str .= $_SERVER['REMOTE_ADDR']; 
        }
        $str .= $_SERVER['HTTP_USER_AGENT'];
        
        // ジャミング
        $str .= "nje4HDa";
        
        // 暗号化
        $str = crypt($str, '$2y$07$ZvnOUqcYywVVmukaNHFVoP$');
        $uId = hash_hmac("haval160,4", $str, "heJH6hfHIh4JNHJe");
        
        return $uId;        
    }
    
    // time.
    function timeSectime($y, $mon, $d, $a, $m) {
        return mktime($a, $m, 0, $mon, $d, $y);
    }
    
    function timeDateRss($sectime) {
        return date(DATE_RFC822, $sectime);
    }
    
    function timeDate($sectime) {
        return getdate($sectime);
    }
}

class DB {
    var $db;
    
    // mysql
    function make() {
        if (empty($this->db)) {
            $this->db = mysqli_connect('localhost', 'my_user', 'my_password', 'my_db');
        }
        
        return $this->db;
    }
    
    function get() {
        return self::make();
    }
    
    function error() {
        $str = "";
        
        if($this->db->connect_errno) {
            $str = $this->db->connect_errno . ' : ' . $this->db->connect_error;
        }
        return $str;
    }
    
    function close() {
        mysqli_close($this->db);
    }

    // JSON.
    function jsonWrite($data, $array) {
        $file = "data/{$data}.data";
        if (! file_exists($file)) {
            return false;
        }
        if (file_put_contents($file, serialize($array)) == false) {
            return false;
        }
        return true;
    }
    
    function jsonRead($data) {
        $json = array();
        $file = "data/{$data}.data";
        if (! file_exists($file)) {
            return $json;
        }
        $json = unserialize(file_get_contents($file));
        return $json;
    }
}

class MAIL {
    function send($toAdrs, $fromAdrs, $subject, $body) {
        if (!STR::checkMail($toAdrs)) {
            return false;
        } elseif (!STR::checkMail($fromAdrs)) {
            return false;
        }
        
        $header = "From: $fromAdrs\nReply-To: $fromAdrs\n";
        return mb_send_mail($toAdrs, $subject, $body, $header);
    }
}

class SONOTA {
    // Make Crypt's Salt.
    function makeSalt() {
        $char = array_merge(range('a', 'z'), range('A', 'Z'), array('.', '/'));
        
        $salt = "";
        for ($i = 0; $i < 22; $i++) {
            $salt .= $char[mt_rand(0, count($char) - 1)];
        }
        
        return $salt;
    }
}
?>