"Typon" Ver.20190609. | TheoryOfContraints official blog

"Typon" Ver.20190609.

Typonのフレーム部分は動いていて、それぞれの関数は確かめてない版だ

 

動作チェックできてないので、使うなよ。責任は取らんぞ

以上 ニコ

 

-------[index.php]-------

<?php
    // Typon Seting.
    define("typonDomain",        "localhost");
    define("typonExecNo",        0);
    define("typonExecDir",        "frames/");
    define("typonDataDir",        "data/");
    define("typonSessionName",    "Heni39EDc");
    define("typonHashSeed",        "edJIe23Om");
    define("typonDebug",        0);
    
    // Session Seting.
    ini_set('session.cookie_httponly', 1); // http only.
    ini_set('session.use_strict_mode', 1); // server mode only.
    // ini_set('session.cookie_secure', 1); // if https then.
    
    //     ヌルバイトアタック処理
    function sanitizer($array) {
        if (is_array($array)) {
            return array_map('sanitizer', $array);
        }
        return str_replace("\0", "", $array);
    }

    $_POST = sanitizer($_POST);
    $_COOKIE = sanitizer($_COOKIE);
    $_SERVER = sanitizer($_SERVER);
    $_GET = array(); // Delete gets.
    
    // Typon Debug Check.
    if (typonDebug == 1) {
        $error = 0;
        if (!preg_match('/\A'.typonDomain.'/i', $_SERVER['SERVER_NAME'])) {
            $error = 1;
        } elseif (!file_exists(typonDataDir)) {
            $error = 1;
        } elseif (!file_exists(typonExecDir)) {
            $error = 1;
        } elseif (!file_exists(typonExecDir."toppage.frame")) {
            $error = 1;
        }
        
        if ($error == 1) {
            echo("[Typon] Error.");
        } else {
            echo("[Typon] No Error.");
        }
        exit;
    }
        
    // ドメインチェック
    if (!preg_match('/\A'.typonDomain.'/i', $_SERVER['SERVER_NAME'])) {
        // 不正アクセス
        echo("[Typon] Domain name Error."); exit;
    }
    
    // md Setting.
    mb_language("Japanese");
    mb_internal_encoding("UTF-8");
    
    // セッションIDリセット
    session_name(typonSessionName);
    session_start();
    session_regenerate_id(true);
    
    //Get $_GET.
    $requestDATA = STD::cmdline();
    
    // プレゼンテーターネームチェック
    $exec = $requestDATA['0'];
    if ($exec == "") {
        // "/"なのでtoppageを実行。indexはindex.phpと競合する
        $exec = "toppage";
        $requestDATA['0'] = $exec;
    } elseif (!preg_match('/\A[a-zA-Z0-9\-\_]+\z/i', $exec)) {
        // 不正アクセスなのでログアウト
        STD::logout();
        exit;
    }
    
    // プレゼンテーターがあるか?
    if (! file_exists(typonExecDir.$exec.".frame")) {
        if ($exec == "toppage") {
            // error.
            echo("[Typon] Error: No thing [toppage.frame].");
            exit;
        } else {
            // 不正アクセスなのでログアウト
            STD::logout();
            exit;
        }
    }
    
    // 実行
    require_once(typonExecDir.$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 checkNull($str) {
        return empty($str);
    }
    
    function htmlConvert($str) {
        return htmlspecialchars($str, ENT_QUOTES);
    }

    function randomText($len) {
        $char = array_merge(range('a', 'z'), range('A', 'Z'), range('0', '9'));
        
        $salt = "";
        for ($i = 0; $i < $len; $i++) {
            $salt .= $char[mt_rand(0, count($char) - 1)];
        }
        
        return $salt;
    }

    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 FORM {
    function session() {
        $_SESSION['session'] = STR::randomText(60);
        return $_SESSION['session'];
    }
    
    function sessionCheck($str) {
        $check = $_SESSION['session'];
        $_SESSION['session'] = null;
        
        if ($check == $str) {
            return true;
        } else {
            return false;
        }
    }
}

class STD {
    // GET取得
    function cmdline() {
        $str = trim($_SERVER['REQUEST_URI'], "\/");
        $data = explode("/", $str);
        
        if (typonExecNo > 0) {
            for ($i = 0; $i < typonExecNo; $i++) {
                unset($data[$i]);
            }
            $data = array_values($data);
        }
        
        return $data;
    }

    // ドメインチェック
    function refererCheck() {
        if (!preg_match('/\Ahttps?(\:\/\/)'.typonDomain.'[\:\/]/i', $_SERVER['HTTP_REFERER'])) {
            // 不正アクセスなのでログアウト
            self::reset();
            exit;
        }
    }
    
    // Loginセーブ
    function loginSave($userId) {
        $_SESSION['id'] = $userId;
        STD::uidMake($userId);
    }
    
    // Loginチェック
    function loginCheck() {
        if (empty($_SESSION['id'])) {
            self::logout();
            exit;
        } else {
            self::refererCheck();
        }
    }

    // ログアウト
    function logout() {
        $_SESSION = array();

        // クッキーを削除
        setcookie(typonSessionName, '', time()-1000);
        setcookie(typonSessionName, '', time()-1000, '/');
        
        session_destroy();
        header("Location: /");
    }
    
    // uID.
    function uidMake() {
        $user_id = $_SESSION['id'].STR::randomText(60);
        $user_id = hash_hmac("ripemd160", $user_id, typonHashSeed);
        
        $_SESSION['uid'] = $user_id;
        return $_SESSION['uid'];
    }
    
    function uidCheck($str) {
        $uid = $_SESSION['uid'];
        // self::uidMake($_SESSION['id']);
        if ($_SESSION['uid'] == $str) {
            return true;
        }
        return false;
    }
    
    function uidGet() {
        return $_SESSION['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 = typonDataDir."{$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 = typonDataDir."{$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 = "$2y$07$";
        for ($i = 0; $i < 22; $i++) {
            $salt .= $char[mt_rand(0, count($char) - 1)];
        }
        $salt .= "$";
        
        return $salt;
    }
}
?>