これまたようやくValidation

2017年9月24日7:00 公開


CodeIgniter、元々の機能(formヘルパーとか。CSRF設定とか)を最初からきちんと活用していれば全く無問題だったのですが。

こちらのサンプルプログラム公開にあたり、ようやくまともにvalidationを使用するようにしました。

ええ、それまでは使ってなかった。。。

い、言い訳としては、post使用する時は汎用のController使っていたんですよね!

……これも、元から来たページを考慮するような作りにしておけば、問題なくvalidation出来たと思うけど。

でも、作った時は、というより当初の計画?としては、拍手とか投票のように、validation関係なく動く型のモノ想定していたので、汎用controllerはその辺り、無視していたというか。。。

いや、単に私がズボラなだけで。

(うん、結論はコレだ)

とにかく。

今回は公開用(でもって一般使用向け)ということで、真面目にやりました。

そうですねー。

コードはやっぱり、サンプルプログラムの方から行きましょうか。

ちなみにサンプルプログラムの方は、ライブラリの中で諸々処理させています。(一応汎用化?)

BBSのような、他ではvalidaion絡み共用しないプログラムについては、Controllerの中で直接、validationしています。

                    サンプルプログラム用ライブラリ

if (!defined('BASEPATH')) exit('No direct script access allowed');

class Easy_sample {

	public function __construct(array $config = array()) {
        $this->CI = & get_instance();
        $this->CI->load->library('Form_validation');
    }

	public function make_hash($form_view=true,$argo=PASSWORD_BCRYPT) {
		if ($argo === PASSWORD_BCRYPT) {
			$crypt_method['argo'] = 'BCRYPT';
		}

		$disp_data['title'] = 'easy hash';
		$disp_data['func'] = 'login';
		$disp_data['proc'] = 'input';
        $disp_data['id'] = 'sample_hashmake';

        $ret = $this->get_trackback_data($disp_data['id']);
        $disp_data['tb_data'] = isset($ret['tb_data']) && !empty($ret['tb_data']) ? $ret['tb_data'] : false;
        $disp_data['cron_tb_data'] = isset($ret['cron_tb_data']) && !empty($ret['cron_tb_data']) ? $ret['tb_data'] : false;

		if ($form_view) {
			$this->CI->load->view('easy_sample/hash_form', $crypt_method);
		}

		$input_data = $this->CI->input->post();
		if (isset($input_data)) {
			if (isset($input_data['hash_make_pass'])) {
				$out_pass['original'] = $input_data['hash_make_pass'];
				$out_pass['result'] = password_hash($input_data['hash_make_pass'], $argo);
				return $out_pass;
			}
		}
	}

    public function disp_hash() {
		$disp_data['title'] = 'easy hash';
		$disp_data['func'] = 'login';

        $disp_data['id'] = 'sample_hashmake';

        $ret = $this->get_trackback_data($disp_data['id']);
        $disp_data['tb_data'] = isset($ret['tb_data']) && !empty($ret['tb_data']) ? $ret['tb_data'] : false;
        $disp_data['cron_tb_data'] = isset($ret['cron_tb_data']) && !empty($ret['cron_tb_data']) ? $ret['tb_data'] : false;

		$this->CI->load->view('easy_sample/easy_header', $disp_data);
		$this->CI->load->view('easy_sample/easy_navbar', $disp_data);
		$disp_data = $this->make_hash(false, PASSWORD_BCRYPT);

		if (isset($disp_data) && isset($disp_data['original']) && isset($disp_data['result'])) {
			$disp_data['proc'] = 'result';
			$this->CI->load->view('easy_sample/hash_form', $disp_data);		
		} else {
			$disp_data = $this->make_hash(true, PASSWORD_BCRYPT);
		}
		$this->CI->load->view('easy_sample/easy_footer', $disp_data);    
    }

    public function disp_trackbacksend($func='') {
        if (empty($func)) {$func = 'input';}
        if ($func=='confirm') {
            // validation
            $this->_set_validation('trackbacksend');
            if($this->CI->form_validation->run() == false){
                $this->disp_trackbacksend();
                return;
            }  
        } elseif ($func=='result') {
            foreach ($_POST as $key => $val) {
                if (strpos($key, 'token') !== FALSE || $key=='ret_url') {continue;}
                $disp_data['result'][$key] = $val;
            }
            // trackback send
            $this->CI->load->library('Trackback_handling');
            $ret_url = $this->CI->trackback_handling->trackback_send();
            if (!empty($ret_url)) {
                $disp_data['result_message'] = 'トラックバックを送信しました。';
            } else {
                // error
                $disp_data['result_message'] = 'トラックバックを送信出来ませんでした。';
            }
        }

        $disp_data['title'] = 'easy trackback send';
        $disp_data['proc'] = $func;
        $disp_data['func'] = 'login';
        $disp_data['id'] = 'sample_trackbacksend';

        $ret = $this->get_trackback_data($disp_data['id']);
        $disp_data['tb_data'] = isset($ret['tb_data']) && !empty($ret['tb_data']) ? $ret['tb_data'] : false;
        $disp_data['cron_tb_data'] = isset($ret['cron_tb_data']) && !empty($ret['cron_tb_data']) ? $ret['tb_data'] : false;

        $this->CI->load->view('easy_sample/easy_header', $disp_data);
        $this->CI->load->view('easy_sample/easy_navbar', $disp_data);
        $this->CI->load->view('easy_sample/trackback_form', $disp_data);
        $this->CI->load->view('easy_sample/easy_footer', $disp_data);   
    }

    private function _set_validation($proc='') {
        if (!empty($proc) && $proc='trackbacksend') {
            $this->CI->form_validation->set_rules('ret_url', 'ret_url', 'trim|required');
            $this->CI->form_validation->set_rules('title', '記事タイトル', 'trim|required');
            $this->CI->form_validation->set_rules('excerpt', '記事概要', 'trim|required');
            $this->CI->form_validation->set_rules('send_blog_name', 'ブログ名', 'trim|required');
            $this->CI->form_validation->set_rules('send_url', 'ブログ記事URL', 'trim|required');
            $this->CI->form_validation->set_rules('ping_url', '送信先URL', 'trim|required');
        }	
    }

    private function get_trackback_data($id='') {
        if (empty($id)) {return;}
        $this->CI->load->library('trackback_handling');

		// trackback data read
		$ret_data['tb_data'] = $this->CI->trackback_handling->get_data_trackback(MY_SYS_NAM, array($id));
			
		// cronjob data read
		$ret_data['cron_tb_data'] = $this->CI->trackback_handling->get_data_trackback('cronjob', array($id));

        return $ret_data;

    }
}

                

ちなみに、公開用プログラムのトラックバック送信では、CodeIgniterのCSRF対策機能をOnにしています。

それを活かす為、トラックバック送信時には、tokenのチェックをしています。

通常通り送信先がCodeIgniter管理下のページならば、このチェックはCodeIgniterが勝手にやってくれるから不要なんですが、トラックバックの場合、送信先は別サーバーですからね。

これは必要ということで。(うん、その筈)

じゃないと完了画面バカ打ちするような攻撃で私も相手先も大迷惑状態になっちゃいますから。

hash作る方はそういうの関係ないのであんまり考えてないですが、現在のapplication全体でCSRF対策onになっている現状機能しているでしょうね。

でもこちらはvalidationガン無視です。(コード見ていただけたら分かるでしょうが)

他にサンプル作る場合もこちらのライブラリに追加していく予定です。

でも、今のところ思いつかないなぁ。。。



メニューページ

メインコンテンツ

タグ別

公開日別

Popular Entries

うちの型落ちMacもぽちぽちとアップデートかけていたりする訳ですが。最近ちょっと多くないですかー?Big Surさん?ちょっと勘弁して欲しいんですけど!確かに明らかにクライアントとして使用すべきMac
Read more
当初は常識的に?レンタルサーバー上でクーロン実行考えていたですが。良く良く考えてみれば。私が今クーロンで実行させたいと思っているスクリプトは、レンタルサーバーで実行する必要全然ない、んですよねー。要は
Read more
php7.2 へのバージョンアップが予定通り、レンタルサーバーさんでされました。一応、事前にドキュメント読んだりはしたつもりだったですが。出ました。思いっ切り出ましたね!エラー。しかも、ちょっと恥ずか
Read more
全然気づいていなかったけれども。コンテンツサイトでjstreeが動かなくなっていたんですよね。ちょっと前にごちょごちょ弄くってはいたので、何かやらかしたか?!と思っていたのですが。(ほら、jsだから、
Read more
ちょっと都合に付き、MySQLをサイトで使うようにしようかなと思い立ちました。でもいきなりレンタルサーバー様でMySQL使うのはリスキー。取り敢えず、検証環境で使えるように、とうことで、やはりNASで
Read more

Recent Comments

Information

緊急連絡は現在ありません。

Recent Update

さて。改装しておよそ1か月経過しました。といっても、見かけは変えてないつもりなのでわからないでしょーが。今回の改装ポイントは、前は完全関数型使用でした、が、今回は可能な限りクラス使用しています。うん、
Read more
DjangoでのエラーをADMINSにメール送信出来る環境を整え。なかなか良い感じにバグフィックス出来るようになってきたな~Sentryお役御免か?なんて良い気になってましたよ、ハイ。すいません、私で
Read more
うちの型落ちMacもぽちぽちとアップデートかけていたりする訳ですが。最近ちょっと多くないですかー?Big Surさん?ちょっと勘弁して欲しいんですけど!確かに明らかにクライアントとして使用すべきMac
Read more
PythonとDjangoアップデートであります。早いですよ、やっぱり!(Pythonも3.9。。。4はいつ頃なんだっけ?確かもうスケジュールされてたような。あれ、Djangoだけかな)Djangoで
Read more
サイト改装、というか、プログラム&フレームワーク切替から少々時間経過しました。(確か8月頭に処理した筈)思わぬエラーや自分的見落としやらミスによるエラー対応もほぼほぼ終了。終息したかなっと思ってます。
Read more

Preview

Information(Board)

サイト改装しました! といいつつ、表向きは全く変わらない(ように作った)筈です。 何かおかしいところがございましたら、ご連絡頂けると助かります。
Read more