TheoryOfContraints official blog
1 | 2 | 3 | 4 | 5 | 最初次のページへ >>

PHPで変なテキトーなパスワードハッシュの作り方のパッチ var.20200715

少し機能を追加したのでパッチをブログで残しておく

 

ShiftとShiftをXorして、それをXorするのは、クロス・クロスオア・シフトって言うジョークで作った

 

        static function NotXorLeft($x) {
            if ($x > 16) {
                $x = 16;
            }
            $x = self::$seed << $x;
            self::Not();
            self::$seed = self::$seed ^ $x;
        }
        
        static function NotXorRight($x) {
            if ($x > 16) {
                $x = 16;
            }
            $x = self::$seed >> $x;
            self::Not();
            self::$seed = self::$seed ^ $x;
        }
        
        static function XxorShift($x, $y) {
            if ($x > 16) {
                $x = 16;
            }
            if ($y > 16) {
                $y = 16;
            }
            $x = self::$seed >> $x;
            $y = self::$seed << $y;
            $x = $x ^ $y;
            self::$seed = self::$seed ^ $x;
        }
        
        static function NotXxorShift($x, $y) {
            if ($x > 16) {
                $x = 16;
            }
            if ($y > 16) {
                $y = 16;
            }
            $x = self::$seed >> $x;
            $y = self::$seed << $y;
            $x = $x ^ $y;
            self::Not();
            self::$seed = self::$seed ^ $x;
        }
        
 

PHPで変なテキトーなパスワードハッシュの作り方 var.20200713

パスワードハッシュプログラムの改良版を作った。

 

i*でunpuckして、暗号化後、i*のpackで戻して。それを暗号化すると元へ戻るのは面白い


ライセンスは、てきとーなMITライセンスで良いので

 

- 以下、ソースリスト ------

<?php
    class Password {
        static $seed;
        static $OriginSeed;
        static $HashHash;
        
        static function SetSeed($seed) {
            self::$seed = $seed;
            self::$OriginSeed = $seed;
            
            self::$HashHash = "efgsdsegew";
        }
        
        static function ResetSeed() {
            self::$seed = self::$OriginSeed;
        }
        
        static function Lcg($x, $y) {
            self::$seed = floor(self::$seed / 10000);
            $x = $x | 1;    // 奇数で掛ける
            if ($x >= 10000) {
                $x = 9999;
            }
            if ($y >= 10000) {
                $y = 9999;
            }
            self::$seed = self::$seed * $x + $y;
        }
        
        static function Not() {
            self::$seed = ~self::$seed;
        }
        
        static function Xor($x) {
            self::$seed = self::$seed ^ $x;
        }
        
        static function XorLeft($x) {
            if ($x > 16) {
                $x = 16;
            }
            $x = self::$seed << $x;
            self::$seed = self::$seed ^ $x;
        }
        
        static function XorRight($x) {
            if ($x > 16) {
                $x = 16;
            }
            $x = self::$seed >> $x;
            self::$seed = self::$seed ^ $x;
        }
        
        static function RndSeed() {
            // 適当なランダム処理
            self::Lcg(3202, 1233); // 乗算+加算から始めるのがセオリーらしい
            
            self::Not();
            self::Xor(904845396);
            self::Not();
            self::Xor(12345678901234567);
            self::XorRight(15);
            
            // エラーチェック
            if (is_float(self::$seed)) {
                echo("Error: Float."); exit;
                //self::$seed = self::$OriginSeed;
            }
             if (self::$seed == 0) {
                self::$seed = self::$OriginSeed;
            }
           
            return self::$seed;
        }
        
        static function MakeHash ($password, $seed) {
            self::SetSeed($seed);
            
            $data = unpack("i*", $password);
            
            $password = "";
            foreach ($data as $value) {
                $value ^= self::RndSeed();
                
                $password .= pack("i*", $value);
            }
                        
            return hash_hmac('ripemd160', $password, self::$HashHash);
        }
        
        // 参考URL
        // https://qiita.com/k_nitadori/items/42970f850d5e2cffdff7
    }
    
    echo(Password::MakeHash("password", 1234567890));

 

PHPで変なテキトーなパスワードハッシュの作り方

ツイッターの方で、テキトーでパスワードハッシュを作ったら、悪いハッカーが嫌がるのではないのか?を考察していたけど

 

それを暇つぶしで実装して、大体で動いている物が出来た。いくつかパスワードを作成して、ハッシュが出来ているのは確かめたけど。実際で使えるかどうかは知らない

 

試験的な実装なので

 

- 以下、ソースリスト ------

<?php
    class Password {
        static $seed;
        
        static function RndSeed() {
            // 適当なランダム処理
            self::$seed = ~self::$seed;
            self::$seed = self::$seed ^ 904845396; //XOR
            self::$seed = self::$seed ^ 12345678901234567; //XOR
            self::$seed = ~self::$seed; //NOT
            self::$seed = self::$seed * 6 + 1233;
            
            // 丸める
            self::$seed = self::$seed % 10000000000000000000;
            
            return self::$seed;
        }
        
        static function MakeHash ($password, $seed) {
            self::$seed = $seed;
            
            $data = unpack("i*", $password);
            
            $password = "";
            foreach ($data as $value) {
                $seed = self::RndSeed();
                $value = $value ^ $seed;
                
                $password .= pack("C*", $value);
            }
            return hash_hmac('ripemd160', $password, 'secret');
        }
    
    }
    
    echo(Password::MakeHash("password", 1234567890));

Very Light Weight Frame work "Typon" Ver20200629

とりあえず、今の状況。本体のみ

 

-------

<?php
    /**
     * Very light framework is the "Typon".
     * Ver.20200629.
     * @author kubohisa at pdbrec.com.
     */
    
    // Requires.
    require_once('../lib/typon/stdio.phl');
    require_once('../lib/typon/setting.phl');
    require_once('../lib/smarty/Smarty.class.php'); // Smarty3.
    
    /**
     * Start Typoon IPL.
     */

    // null.
    function sanitizer($arr) {
        if (is_array($arr) ){
            return array_map('sanitizer', $arr);    
        }
        return str_replace("\0", "", $arr);
    }
    $_POST = sanitizer($_POST);
    $_COOKIE = sanitizer($_COOKIE);
    $_SERVER = sanitizer($_SERVER);
    $_GET = array(); // Delete gets.
    
    // Domain check.
    if ($_SERVER['SERVER_NAME'] != Ty\TyponReg::$DomeinName) {
        Ty\STDIO::ErrorCode(500);
        exit;        
    }
    
    // Https check.
    // テスト環境ではhttpなので外してます
/*    if (empty($_SERVER['HTTPS'])) {
        Ty\STDIO::ErrorCode(500);
        exit;        
    }
*/
    // Longer Url Check.
    if (strlen($_SERVER["REQUEST_URI"]) > 1000) {
        Ty\STDIO::ErrorCode(500);
        exit;        
    }
    
    // md Setting.
    mb_language("Japanese");
    mb_internal_encoding("UTF-8");
    
    // セッションIDリセット
    session_name(Ty\TyponReg::$SessionName);
    session_start();
    session_regenerate_id(true);
    
    // Get Get.
    $UrlGet = preg_split("/\//", $_SERVER["REQUEST_URI"]);
    array_shift($UrlGet);
    
    // Trim Get.
    foreach ($UrlGet as $key => $value){
        $UrlGet[$key] = Ty\Strings::Trim($value);
    }
    
    // ヘルスチェック(仮)
    if ($UrlGet['0'] == "health") {
        echo("Clean.");
        exit;
    }
    
    // adtionがあるか?
    if ($UrlGet['0'] == "" || $UrlGet['0'] == "index") {
        $UrlGet['0'] = "index";
    }
    $ExecName = array_shift($UrlGet);

    if (! preg_match('/\A[a-zA-Z0-9\-\_]++\z/i', $ExecName)) {
        Ty\STDIO::ErrorCode(505);
        exit;
    }
    
    $Statename = "";
    if (! empty($_POST['state'])) {
        $_POST['state'] = Ty\Strings::Trim($_POST['state']);
        
        if (! preg_match('/\A[a-zA-Z0-9\-\_]++\z/i', $_POST['state'])) {
            Ty\STDIO::ErrorCode(505);
            exit;
        }
        
        $Statename = $_POST['state'];
    } else {
        $Statename = "index";
    }
    
    $PresentName = "../scripts/".$ExecName."/".$Statename.".action";
    
    if (! file_exists($PresentName)) {
        Ty\STDIO::ErrorCode(505);
        exit;
    }
    
    // responseがあるか?
    $ResponceName = "../scripts/".$ExecName."/".$Statename.".responce";
    if (! file_exists($ResponceName)) {
        $ResponceName = "";
    }
    
    // Seting Smarty.
    $smarty = new Smarty();
    $smarty->loadFilter('variable', 'htmlspecialchars');
    $smarty->template_dir = '../html';
    $smarty->compile_dir  = '../lib/templates_c';

    // 実行
    require_once($PresentName);
    
    if ($ResponceName != "") {
        require_once($ResponceName);
    }
    
    exit;

Very Light Frame work is "Typoon" Ver.20200223.

とりあえず、ライブラリの実装を進めてますが、バリデーターが沼だ…

ショボーン

 

で、簡易MVPパターンで組んでたけど、ADRパターンを知ったので、POSTでActionのモードを投げてソースリストを分岐で読み込む部分を追加して、Actionのソースを分割できる風に実装した

 

その部分のみをブログで公開しますよ。進捗は進んでます

 

[Typoon.php]

<?php
    /**
     * Very light framework is the "Typoon".
     * Ver.20200223.
     * @author kubohisa at pdbrec.com.
     */
    
    /**
     * Typoon Seting.
     */
    class TypoonReg
    {
        static $SessionName = "Hie4Ewxz";
        static $DomeinName = "localhost";
        
        static $HashDummyA = "esfdf4gesg";
        static $HashDummyB = "erg6gefbdr";
    }
    
    // Requires.
    require_once('../lib/typoon/stdio.phl'); // Smarty3.
    require_once('../lib/smarty/Smarty.class.php'); // Smarty3.
    
    /**
     * Start Typoon IPL.
     */

    // null.
    function sanitizer($arr) {
        if (is_array($arr) ){
            return array_map('sanitizer', $arr);    
        }
        return str_replace("\0", "", $arr);
    }
    $_POST = sanitizer($_POST);
    $_COOKIE = sanitizer($_COOKIE);
    $_SERVER = sanitizer($_SERVER);
    $_GET = array(); // Delete gets.
    
    // Domain check.
    if ($_SERVER['SERVER_NAME'] != TypoonReg::$DomeinName) {
        TypoonSTDIO::ErrorCode(500);
        exit;        
    }
    
    // Https check.
    // テスト環境ではhttpなので外してます
/*    if (empty($_SERVER['HTTPS'])) {
        TypoonSTDIO::ErrorCode(500);
        exit;        
    }
*/
    // md Setting.
    mb_language("Japanese");
    mb_internal_encoding("UTF-8");
    
    // セッションIDリセット
    session_name(TypoonReg::$SessionName);
    session_start();
    session_regenerate_id(true);
    
    // Get Get.
    $UrlGet = preg_split("/\//", $_SERVER["REQUEST_URI"]);
    array_shift($UrlGet);
    
    // Trim get.
    foreach ($UrlGet as $key => $value){
        $UrlGet[$key] = TypoonStrings::Trim($value);
    }

    // プレゼンテーターがあるか?
    if ($UrlGet['0'] == "") {
        $UrlGet['0'] = "index";
    }
    if (! empty($_POST['mode'])) {
        $UrlGet['0'] = $UrlGet['0']."@".$_POST['mode'];
    }
    if (! preg_match('/\A[a-zA-Z0-9\-\_\@]++\z/i', $UrlGet['0'])) {
        TypoonSTDIO::ErrorCode(404);
        exit;
    }
    if (! file_exists("presenter/".$UrlGet['0'].".present")) {
        TypoonSTDIO::ErrorCode(404);
        exit;
    }
    $PresentName = array_shift($UrlGet);
    
    // Seting Smarty.
    $smarty = new Smarty();
    $smarty->loadFilter('variable', 'htmlspecialchars');
    
    // 実行
    require_once("presenter/".$PresentName.".present");
    exit;
?>

phpマイクロ過ぎるフレームワーク”Typoon” Ver.20200216.

お久しぶりです、くぼひさです

 

暇なので、作り始めました。仮組みのプログラムぼろぼろで凄いよね…

笑い泣き

 

とりあえず、ルーティングの部分のみを作りました。以下がソースですよ。後はバリデーションなどのメゾットを追加します

 

良い暇つぶしになりそうだ

 

[typoon.php]

<?php
    /**
     * Very light framework is the "Typoon".
     * Ver.20200216.
     * @author kubohisa at pdbrec.com.
     */
    
    /**
     * Typoon Seting.
     */
    class TypoonReg
    {
        static $SessionName = "Hie4Ewxz";
        static $DomeinName = "localhost";
    }
    
    /**
     * Start Typoon IPL.
     */
    
    // null.
    function sanitizer($arr) {
        if (is_array($arr) ){
            return array_map('sanitizer', $arr);    
        }
        return str_replace("\0", "", $arr);
    }
    $_POST = sanitizer($_POST);
    $_COOKIE = sanitizer($_COOKIE);
    $_SERVER = sanitizer($_SERVER);
    $_GET = array(); // Delete gets.
    
    // Domain check.
    if ($_SERVER['SERVER_NAME'] != TypoonReg::$DomeinName) {
        header('HTTP', true, 500);
        exit;        
    }
    
    // Https check.
    // テスト環境ではhttpなので外してます
/*    if (empty($_SERVER['HTTPS'])) {
        header('HTTP', true, 500);
        exit;        
    }
*/
    // Requires.
    require_once('../lib/smarty/Smarty.class.php'); // Smarty3.
    
    // md Setting.
    mb_language("Japanese");
    mb_internal_encoding("UTF-8");
    
    // セッションIDリセット
    session_name(TypoonReg::$SessionName);
    session_start();
    session_regenerate_id(true);
    
    // Get Get.
    $UrlGet = preg_split("/\//", $_SERVER["REQUEST_URI"]);
    array_shift($UrlGet);

    // プレゼンテーターがあるか?
    if ($UrlGet['0'] == "") {
        $UrlGet['0'] = "index";
    }
    if (! preg_match('/\A[a-zA-Z0-9\-\_]+\z/i', $UrlGet['0'])) {
        header('HTTP', true, 404);
        exit;
    }
    if (! file_exists("presenter/".$UrlGet['0'].".present")) {
        header('HTTP', true, 404);
        exit;
    }
    $PresentName = array_shift($UrlGet);
    
    // exec.
    require_once("presenter/".$PresentName.".present");
    exit;
?>

"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;
    }
}
?>



 

function cmdline()

http://turusuke.hatenablog.com/entry/2012/10/17/php-routing

 

を見て、URLを使ったルーティング処理を

 

$requestDATA = cmdline();
print_r($requestDATA);
exit;

function cmdline() {
    $str = str_replace("\0", "", $_SERVER['REQUEST_URI']);
    $str = trim($str, "\/");
    $data = explode("/", $str);
    
    return $data;
}
    
ってPHPで作った。それで

 

Array ( [0] => category [1] => food )

 

となる

 

C++とかのコマンドライン引数の取得方法と同じですね。などなど、プログラムを作っている

 

 

 

 

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;
    }
}
?>

 

 

 

PHPでプログラムを作っている

最近、PHPでプログラムをしている

 

スマホのゲームのサーバーは、まだ、golangではなく、PHPで出来ているそうなので、久々、PHPでプログラムを作って、少しサーバーのプログラムの作り方を覚え直そうと思ったので

 

まぁ、それほどPHPのプログラムの作り方変化はなかったので、どこまでしょぼく、と言うかスマートに作ろうと思ってたのですけど、データのバリテーションの部分は、(バグが残っているかも知れない)仮組みの状態で

 

<?php

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");
    }
    
    // <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) {
        if ($str == "") {
            return true;
        }
        return false;
    }
    
    function htmlConvert($str) {
        return htmlspecialchars($str, ENT_QUOTES);
    }

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

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

    function number($str) {
        return preg_match('/\A[0-9]+\z/i', $str);
    }
    
    function mail($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);
    }
}

?>

 

って、クラスをネームスペース的に組んで、

 

        $str = STR::mbTrim($_POST['station']);
        $str = STR::htmlConvert($str);
        $data['station'] = $str;
        if (STR::empty($str)) {
            $error['error'] = 1;
            $error['station'] = "ポッドキャストの名前がありません";
        } elseif (STR::len($str) > 100) {
            $error['error'] = 1;
            $error['station'] = "ポッドキャストの名前が100文字以上です";
        }
 

って、elseifでバリデーションを羅列するプログラムの作り方をしているけど、

 

バリデーションの条件で使う、文字列データのチェックの関数があればelseifを使ってバリデーションをチェック出来るので、PHPの標準関数でバリデーション関数があれば、普通にBASICな作り方でウェブのアプリが作れるのでは?

 

って思った

 

標準のfilter関数は使えないんですよね。URLのチェックでスペースや<を調べてないので、正規表現で調べないといけない。それらのバリデーションが標準であれば、普通にウェブのプラグラムが作れるのに

 

ウェブのプログラムは基本、データは文字列変数で、php5では型も無く、基本、文字列変数なので、ウェブのプログラムはほとんど文字列変数の処理を作るのが仕事になるよなと思いながら作っていた

 

あ、unsetの処理は$hoge==""はやめて、empty()へ変更しておこう

 

 

 

 

1 | 2 | 3 | 4 | 5 | 最初次のページへ >>