データのサニタイジング(2-2) 検索画面の作成
サニタイズ済みで登録したデータ取り扱いの、もう一つの問題点。
検索時に、htmlエンティティ済みの値をセットする方法。
controllerで絞込条件をセットする段階で、htmlエンティティ化して登録したfiledごとに、逐次エンティティ化する方が良いようです。
modelのbeforeFindの$queryDataでは、fieldの区別がもうつきません。
管理側のUsers一覧表示画面に、Usersをname(名前)で検索する機能を追加。
作成は、以下を参考にContainableビヘイビア使用*1
http://fresh.pure-white.jp/cakephp/23paginate
http://book.cakephp.org/ja/view/165/Controller-Setup
$nameの入力をサニタイズしてSQLにセットしている箇所は以下。
Index: controllers/users_controller.php
+ $contain["User.name LIKE"] = "%".Sanitize::html($name)."%"; (中略) +$this->set('users', $this->paginate('User', $contain));
SQLインジェクション対策は、暗黙的に実行されるようなので、htmlエンティティのみ処理しています。*2
SELECT `User`.`id`, `User`.`group_id`, `User`.`name`, `User`.`username`, `User`.`password`, `User`.`created`, `User`.`modified` FROM `users` AS `User` WHERE `User`.`name` LIKE '\';' LIMIT 20
その他の処理も含めた全差分。
Index: models/user.php
var $name = 'User';
var $belongsTo = array('Group');
var $actsAs = array(
'Acl' => 'requester',
+ 'Containable',
);
Index: controllers/users_controller.php
function admin_listview() {
- self::_listview();
+ // 検索処理
+ $this->User->contain();
+ $contain = array();
+ $searchword = array();
+ if (!empty($this->data)) {
+ if (isset($this->data['User']['name'])) {
+ $name = $this->data['User']['name'];
+ }
+ } else {
+ if (isset($this->passedArgs['name'])) {
+ $name = urldecode($this->passedArgs['name']);
+ }
+ }
+
+ if (isset($name)) {
+ $contain["User.name LIKE"] = "%".Sanitize::html($name)."%";
+
+ $this->data['User']['name'] = $name;
+ $searchword['name'] = urlencode($name);
+ }
+ $this->set('searchword', $searchword);
+
+ $this->set('users', $this->paginate('User', $contain));
+
}
views/users/admin_listview.ctp*4
+<h4><?php //todo:toggle echo $html->link(__('Search Users', true)); ?></h4> +<fieldset class="searchFieldset" id="adminSearchFieldset"> +<legend><?php __('Search User');?></legend> +<div class="search form"> +<?php echo $form->create('User', array('action' => 'listview', 'type' => 'post')); ?> +<?php echo $form->input('name'); ?> +<?php echo $form->end('Search'); ?> +</div> +<?php $paginator->options(array('url' => $searchword)); ?> +</fieldset>