PHP Token(トークン)の設計

WBOY
WBOYオリジナル
2016-08-08 09:26:491479ブラウズ

再版リンク: http://www.jb51.net/article/13756.htm

PHP トークン設計の設計目標: データの繰り返し送信を避けるため、ソースをチェックして、実行するアクションに一致する外部送信であるかどうかを確認します。 ( PHP ファイルの操作の追加、削除、変更など、同じページに複数のロジックが実装されている場合) ここでいうトークンとは、ページ表示時に FORM に書き込まれる非表示のフォーム項目 (type=hidden) です。 ) トークンを平文にすることはできません。平文だと危険すぎるため、暗号文は可逆的である必要があるため、既成の方法を使用しました。インターネット。

繰り返し送信を回避するには?
配列はバックグラウンド処理中に、正常に送信されたトークンを保存する必要があります。トークンが存在する場合は、それが存在することを意味します。
送信元を確認するにはどうすればよいですか?
はい、このトークンが生成されると、送信時に他の人が HTML (トークンのコピー) をコピーすると、理論的にはトークンに含まれる session_id が追加されます。現在の session_id に関連付けられているため、送信が外部からの送信であると判断できます。
実行するアクションを一致させるにはどうすればよいですか?
トークン化するとき、処理中にアクションをデコードして比較できるように、このトークンのアクション名をトークンに書き込む必要があります。

GEncrypt.inc メソッド。 :
(1) GranteToken パラメータ: formName、アクション名、key が暗号化/復号化キー
形式で文字列を返します:encryption (formName: session_id)
(2) isToken パラメータ: token これが結果です。 GranteToken、formName、アクション名によって生成され、fromCheck がオリジンをチェックするかどうか (true の場合)、トークン内の session_id が現在の session_id と一致するかどうかも判断します。
(3)dropToken、アクションが正常に実行された場合、この関数を呼び出してセッションにトークンを記録します

GToken.inc.php

<?php  
class GEncrypt extends GSuperclass {  
    protected static function keyED($txt,$encrypt_key){     
        $encrypt_key = md5($encrypt_key);     
        $ctr=0;     
        $tmp = "";     
        for ($i=0;$i<strlen($txt);$i++){     
            if ($ctr==strlen($encrypt_key)) $ctr=0;     
            $tmp.= substr($txt,$i,1) ^ substr($encrypt_key,$ctr,1);     
            $ctr++;     
        }     
        return $tmp;     
    }  

    public static function encrypt($txt,$key){     
        //$encrypt_key = md5(rand(0,32000));  
        $encrypt_key = md5(((float) date("YmdHis") + rand(10000000000000000,99999999999999999)).rand(100000,999999));  
        $ctr=0;     
        $tmp = "";     
        for ($i=0;$i<strlen($txt);$i++){  
            if ($ctr==strlen($encrypt_key)) $ctr=0;     
            $tmp.= substr($encrypt_key,$ctr,1) . (substr($txt,$i,1) ^ substr($encrypt_key,$ctr,1));     
            $ctr++;     
        }     
        return base64_encode(self::keyED($tmp,$key));  
    }  

    public static function decrypt($txt,$key){  
        $txt = self::keyED( base64_decode($txt),$key);     
        $tmp = "";  
        for ($i=0;$i<strlen($txt);$i++){     
            $md5 = substr($txt,$i,1);     
            $i++;     
            $tmp.= (substr($txt,$i,1) ^ $md5);     
        }  
        return $tmp;  
    }      
}  
?> 

$_POSTからトークンを取得し、isTokenを使用して判断します。

必要に応じて。実行するアクションが一致するかどうかを判断するには、isToken の formName を変更して実行できますが、一致しないことがわかります。

以上、PHP Token (トークン) の設計を内容も含めて紹介しましたが、PHP チュートリアルに興味のある友人の参考になれば幸いです。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。