これまたようやく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
Recent Comments
Information
Recent Update
Preview
Information(Board)