<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>CodeIgniter &#8211; Mach3.laBlog</title>
	<atom:link href="https://blog.mach3.jp/tag/codeigniter/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.mach3.jp</link>
	<description></description>
	<lastBuildDate>Tue, 01 Mar 2011 01:00:52 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9</generator>
	<item>
		<title>CodeIgniterの出力にMustacheを使ってみる</title>
		<link>https://blog.mach3.jp/2011/03/01/mustache-on-codeigniter.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Tue, 01 Mar 2011 01:00:52 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[Mustache]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Template]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=1631</guid>

					<description><![CDATA[シンプルで軽量なPHPフレームワーク、CodeIgniterのビューで これまた軽量なMustacheを使用してみるメモ。 CodeIgniterのビューファイルではプレーンなPHPを書きますが、 Mustacheを読み [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>シンプルで軽量なPHPフレームワーク、CodeIgniterのビューで<br />
これまた軽量なMustacheを使用してみるメモ。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh3.googleusercontent.com/_JJkNs5Ixl70/TWvWRwYUpcI/AAAAAAAABNc/OL5j1uGU-2Q/201103010203.png" alt="CodeIgniter + Mustache"/></figure>



<p></p>



<span id="more-1631"></span>



<p>CodeIgniterのビューファイルではプレーンなPHPを書きますが、<br />
Mustacheを読み込んで使用する事で、<br />
より簡単な、見通しの良いビューファイルが出来上がるのでは！ と思いやってみました。</p>



<h2 class="wp-block-heading">普通にライブラリとして読み込む</h2>



<h3 class="wp-block-heading">配置する</h3>



<p class="caution">
  執筆時からMustacheのバージョンが変わり、単ファイルではなくなっているため、手順が大きく変わる可能性があります。 （2012/10/25）
</p>



<p>まずはPHP版のMustacheをダウンロードしてきます。</p>



<p>» <a href="https://github.com/bobthecow/mustache.php/">bobthecow/mustache.php · GitHub</a></p>



<p>ダウンロードしてきたMustache.phpを、<br />
system/application/libraries/ にコピーします。<br />
ここは、CIのユーザーライブラリを格納しておくお決まりの場所です。<br />
cf) <a href="http://codeigniter.jp/user_guide_ja/general/creating_libraries.html">ライブラリの作成 : CodeIgniter ユーザガイド 日本語版</a></p>



<h3 class="wp-block-heading">簡単な例</h3>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-keyword">$this</span>-&gt;load-&gt;library( <span class="hljs-string">"mustache"</span> );

<span class="hljs-keyword">echo</span> <span class="hljs-keyword">$this</span>-&gt;mustache-&gt;render(
    <span class="hljs-comment">// 第一引数はテンプレート（文字列）</span>
    <span class="hljs-string">"Hello, I am {{name}}"</span>,
    <span class="hljs-comment">// 第二引数はテンプレートに渡す連想配列</span>
    <span class="hljs-keyword">array</span>( <span class="hljs-string">"name"</span> =&gt; <span class="hljs-string">"HogeFuga"</span> )
);
<span class="hljs-comment">// Hello, I am Hogefuga</span>
</code></span></pre>


<p>文字列をテンプレートとして出力してみた例。</p>



<h3 class="wp-block-heading">ビューファイルを読み込んで出力する</h3>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment">/* コントローラ内 */</span>
<span class="hljs-keyword">$this</span>-&gt;load-&gt;library( <span class="hljs-string">"mustache"</span> );
<span class="hljs-keyword">$this</span>-&gt;mustache-&gt;render(
    <span class="hljs-keyword">$this</span>-&gt;load-&gt;view( <span class="hljs-string">"example.php"</span>, <span class="hljs-keyword">null</span>, <span class="hljs-keyword">true</span> ),
    <span class="hljs-keyword">array</span>(
        <span class="hljs-string">"members"</span> =&gt; <span class="hljs-keyword">array</span>(
            <span class="hljs-keyword">array</span>( <span class="hljs-string">"name"</span> =&gt; <span class="hljs-string">"太郎"</span> ),
            <span class="hljs-keyword">array</span>( <span class="hljs-string">"name"</span> =&gt; <span class="hljs-string">"花子"</span> ),
            <span class="hljs-keyword">array</span>( <span class="hljs-string">"name"</span> =&gt; <span class="hljs-string">"ジョンソン"</span> )
        )
    )
);
</code></span></pre>


<p>CIおなじみの$this-&gt;load-&gt;view()の第三引数にtrueを渡すと<br />
結果を文字列で受け取れるのでそれを使います。</p>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="hljs-comment">&lt;!--ビューファイル（example.php）--&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">ul</span>&gt;</span>
    {{#members}}
    <span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span>わたしが{{name}}です！<span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
    {{/members}}
<span class="hljs-tag">&lt;/<span class="hljs-name">ul</span>&gt;</span>
</code></span></pre>


<p>出力結果</p>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="hljs-comment">&lt;!--出力結果--&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">ul</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span>わたしが太郎です！<span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span>わたしが花子です！<span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span>わたしがジョンソンです！<span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">ul</span>&gt;</span>
</code></span></pre>


<h2 class="wp-block-heading">Controllerを拡張してみる</h2>



<p>毎度$this-&gt;mustache-&gt;render()と、$this-&gt;load-&gt;view()を<br />
両方呼ぶのが面倒だと感じたなら、<br />
コアクラスのControllerを拡張してしまう手もあります。</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment">/*
 * 2.0でおき場所がかわったので注意
 * 1.7.x → system/application/libraries/MY_Controller.php
 * 2.0 → system/application/core/MY_Controller.php
 */</span>
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MY_Controller</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Controller</span> </span>{

    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">__construct</span><span class="hljs-params">()</span></span>{
        <span class="hljs-keyword">parent</span>::__construct();
        <span class="hljs-keyword">$this</span>-&gt;load-&gt;library(<span class="hljs-string">"mustache"</span>);
    }

    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">_render</span><span class="hljs-params">( $name, $data = null, $return = false )</span></span>{
        $res = <span class="hljs-keyword">$this</span>-&gt;mustache-&gt;render(
            <span class="hljs-keyword">$this</span>-&gt;load-&gt;view( $name, <span class="hljs-keyword">null</span>, <span class="hljs-keyword">true</span> ),
            $data
        );
        <span class="hljs-keyword">if</span>( $return ) <span class="hljs-keyword">return</span> $res;
        <span class="hljs-keyword">echo</span> $res;
    }
}
</code></span></pre>


<p>上の例では、$this-&gt;_render()を使う事で、<br />
$this-&gt;load-&gt;view()と同じ要領でビューファイルを<br />
Mustacheを通して出力する事が出来ます。</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-keyword">$this</span>-&gt;_render(
    <span class="hljs-string">"example.php"</span>,
    <span class="hljs-keyword">array</span>( <span class="hljs-string">"name"</span> =&gt; <span class="hljs-string">"foobar"</span> )
);
</code></span></pre>


<h2 class="wp-block-heading">まとめ</h2>



<p>単純な出力しか出来ないので場合によっては不向きですが、<br />
他言語とテンプレートの共有が出来るなんていう利点もあったり。<br />
なかなか悪くない組み合わせな気がします。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>PHP: CodeIgniterをセキュアに使うチュートリアル</title>
		<link>https://blog.mach3.jp/2010/07/08/php-codeigniter-security.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Thu, 08 Jul 2010 00:16:00 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Video]]></category>
		<guid isPermaLink="false">http://lab.mach3.jp/2010/07/08/php-codeigniter%e3%82%92%e3%82%bb%e3%82%ad%e3%83%a5%e3%82%a2%e3%81%ab%e4%bd%bf%e3%81%86%e3%83%81%e3%83%a5%e3%83%bc%e3%83%88%e3%83%aa%e3%82%a2%e3%83%ab.html</guid>

					<description><![CDATA[PHPフレームワークは数多く公開されておりますが、 中でも個人的にお気に入りなのはシンプル・軽量さが売りのCodeIgniterです。 » CodeIgniter &#8211; Open source PHP web  [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>PHPフレームワークは数多く公開されておりますが、<br />
中でも個人的にお気に入りなのはシンプル・軽量さが売りのCodeIgniterです。<br />
» <a href="http://codeigniter.com/" target="_blank">CodeIgniter &#8211; Open source PHP web application framework</a><br />
この度Nettuts+でCodeIgniterをセキュアに使うためのチュートリアルが紹介されていました。</p>



<p>※2010/08/07 セッションエンコーディングの項で、キー文字列を入力した例を追記</p>



<figure class="wp-block-image"><img decoding="async" src="http://lh5.ggpht.com/_JJkNs5Ixl70/TDSZBzTl3wI/AAAAAAAAA9w/zE4KjrHWOj4/s800/201007072219.png" alt="CodeIgniter"/></figure>



<p></p>



<span id="more-2246"></span>



<p><a href="http://net.tutsplus.com/tutorials/php/codeigniter-from-scratch-security/">CodeIgniter from Scratch: Security | Nettuts+</a></p>



<p><embed src="http://blip.tv/play/gcMVgeq9QAI%2Em4v" type="application/x-shockwave-flash" width="480" height="390" allowscriptaccess="always" allowfullscreen="true"><br />
</p>



<p>こちらがそのチュートリアルビデオなのですが…<br />
35分と大変長いので、要点だけ下にまとめておきます。<br />
ビデオではスクラッチから書いていて大変わかりやすいので、<br />
時間がある時に見ておくと良いと思います！<br />
英語ですが、コードだけ見ていても参考になります。</p>



<ol class="wp-block-list">
<li><a href="#security-1">パラメータに使用される文字を制限する</a></li>



<li><a href="#security-2">パスワードエンコーディング</a></li>



<li><a href="#security-3">SQLインジェクション対策</a></li>



<li><a href="#security-4">クロスサイトスクリプティング対策</a></li>



<li><a href="#security-5">セッションエンコーディング</a></li>



<li><a href="#security-6">PHPのエラー表示を消す</a></li>



<li><a href="#security-7">プライベートメソッドを使う</a></li>
</ol>



<h2 class="wp-block-heading" id="security-1">1. パラメータに使用される文字を制限する</h2>



<p>CodeIgniterはURLの一部をメソッドの引数として受け取りますが、<br />
そこで使用可能な文字をconfig.phpで厳しく管理しています。</p>


<pre class="wp-block-code"><span><code class="hljs language-php">$config&#91;<span class="hljs-string">'permitted_uri_chars'</span>] = <span class="hljs-string">'a-z 0-9~%.:_-'</span>;
</code></span></pre>


<p>正規表現の書式で指定されているここの値を、より厳格にする事で<br />
クライアント側からの予期せぬインプットを防ぐ事が出来ます。<br />
制作するアプリケーションによって中身を精査すると良いでしょう。</p>



<h2 class="wp-block-heading" id="security-2">2. パスワードエンコーディング</h2>



<p>sha1やmd5等のPHPに既存の関数ではなく、<br />
よりセキュアにエンコーディング出来るencryptライブラリの使用が推奨されています。</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-keyword">$this</span>-&gt;load-&gt;library(<span class="hljs-string">"encrypt"</span>);
<span class="hljs-keyword">$this</span>-&gt;encrypt-&gt;encode($mypassword);
</code></span></pre>


<p>encryptライブラリは、キーとなる文字列を第二引数に指定する事で、<br />
可逆エンコードする事も出来ます。</p>


<pre class="wp-block-code"><span><code class="hljs language-php">$key = <span class="hljs-string">"this is private key string"</span>;

$encoded_password = <span class="hljs-keyword">$this</span>-&gt;encrypt-&gt;encode($mypassword, $key); <span class="hljs-comment">// エンコード</span>
$decoded_password = <span class="hljs-keyword">$this</span>-&gt;encrypt-&gt;decode($encoded_password, $key); <span class="hljs-comment">//デコード</span>
</code></span></pre>


<p>cf) <a href="http://codeigniter.jp/user_guide_ja/libraries/encryption.html">暗号化クラス : CodeIgniter ユーザガイド 日本語版</a></p>



<h2 class="wp-block-heading" id="security-3">3. SQLインジェクション対策</h2>



<p>SQLインジェクション攻撃に備えて、<br />
クライアント側からインプットされた値をDBに渡す前に消毒してやります。</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-keyword">$this</span>-&gt;load-&gt;database();
$query = <span class="hljs-keyword">$this</span>-&gt;db-&gt;query(<span class="hljs-string">"SELECT * FROM users WHERE name = {$this-&gt;db-&gt;escape($name)}"</span>);
</code></span></pre>


<p>また、ActiveRecordクラスを使用する事で<br />
最小限のスクリプティングでDBへアクセスする事が出来ます。<br />
この場合、入力された値のエスケープは自動で行わるので、意識する必要がありません。</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-keyword">$this</span>-&gt;load-&gt;database();
$query = <span class="hljs-keyword">$this</span>-&gt;db-&gt;select(<span class="hljs-string">"*"</span>)-&gt;from(<span class="hljs-string">"users"</span>)-&gt;where(<span class="hljs-string">"name"</span>,$name);
</code></span></pre>


<p>cf) <a href="http://codeigniter.jp/user_guide_ja/database/active_record.html">Active Record クラス : CodeIgniter ユーザガイド 日本語版</a></p>



<h2 class="wp-block-heading" id="security-4">4. クロスサイトスクリプティング対策</h2>



<p>いわゆるXSSという奴です。<br />
この攻撃に備えて、値のインプットとアウトプット両方において<br />
フィルタをかけてやる必要があります。</p>



<h3 class="wp-block-heading">■インプット</h3>



<p>インプットは、$_POSTを使わずに入力クラスを用いて値を受け取りましょう。</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-keyword">$this</span>-&gt;input-&gt;post(<span class="hljs-string">"comment"</span>, <span class="hljs-keyword">true</span>);
</code></span></pre>


<p>第二引数にtrueを渡す事で、XSSフィルタを入力された値に適用できます。<br />
また、config.phpでの設定で、XSSフィルタリングをデフォルトでかける事が出来ます。</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment">// /system/application/config/config.php</span>
$config&#91;<span class="hljs-string">'global_xss_filtering'</span>] = <span class="hljs-keyword">TRUE</span>;
</code></span></pre>


<p>これで第二引数がなくともXSSフィルタがかかるようになりました。</p>



<p>単独でフィルタが使いたい場合は、xss_cleanメソッドを使いましょう。</p>


<pre class="wp-block-code"><span><code class="hljs language-php">$clean_string = <span class="hljs-keyword">$this</span>-&gt;input-&gt;xss_clean($string);
</code></span></pre>


<h3 class="wp-block-heading">■アウトプット</h3>



<p>アウトプット時は、PHP組み込みのhtmlspecialcharsを用いるか、</p>


<pre class="wp-block-code"><span><code class="hljs language-php">htmlspecialchars($string);
</code></span></pre>


<p>または、CodeIgniterのヘルパ関数による出力をする事で<br />
自動的にフィルタリングがかけられます。</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-keyword">$this</span>-&gt;load-&gt;helper(<span class="hljs-string">"url"</span>);
<span class="hljs-keyword">echo</span> anchor($url);
</code></span></pre>


<h2 class="wp-block-heading" id="security-5">5. セッションエンコーディング</h2>



<p>CodeIgniterのセッションはPHP組み込みのセッションを使用せず、<br />
独自のセッションデータを生成して利用します。</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-keyword">$this</span>-&gt;load-&gt;library(<span class="hljs-string">"session"</span>);
<span class="hljs-keyword">$this</span>-&gt;session-&gt;set_userdata(<span class="hljs-string">"user_id"</span>, <span class="hljs-number">2</span>); <span class="hljs-comment">//セッションデータの入力</span>
<span class="hljs-keyword">$this</span>-&gt;session-&gt;userdata(<span class="hljs-string">"user_id"</span>); <span class="hljs-comment">//セッションデータの取得</span>
</code></span></pre>


<p>上のように、ログイン状態を保持する場合等に頻繁に使われますが、<br />
cookieを覗いて見ると、user_idの値が丸見えになっていて大変危険です。<br />
これを保護する為に、セッションエンコード用のキー文字列を<br />
config.phpで設定してやりましょう。</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment">// /system/application/config/config.php :</span>
$config&#91;<span class="hljs-string">'encryption_key'</span>] = <span class="hljs-string">""</span>;
</code></span></pre>


<p>デフォルトでは空白なので、なんらかの文字列を入れてあげましょう。</p>


<pre class="wp-block-code"><span><code class="hljs language-php">$config&#91;<span class="hljs-string">'encryption_key'</span>] = <span class="hljs-string">"QEE3Ka2A9ABYhY4dU2VIQau8"</span>;
</code></span></pre>


<p>» <a href="http://codeigniter.jp/user_guide_ja/libraries/sessions.html">セッションクラス : CodeIgniter ユーザガイド 日本語版</a></p>



<h2 class="wp-block-heading" id="security-6">6. PHPのエラー表示を消す</h2>



<p>デフォルトがE_ALLになっているので0を入れてあげましょう。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-comment">// /index.php :</span>
error_reporting(<span class="hljs-number">0</span>);
</code></span></pre>


<h2 class="wp-block-heading" id="security-7">7. プライベートメソッドを使う</h2>



<p>コントローラ内のメソッドは基本的に全てアクセス可能ですが、<br />
プライベートな物としてコントローラの中でのみ使いたい、<br />
そんな時はメソッドの頭にアンダースコアをつけてあげると、<br />
外部からのアクセスが出来なくなり、ブラウザでアクセスしても404となります。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Hoge</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Controller</span> </span>{
    <span class="hljs-comment">/* 中略 */</span>
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">public_method</span> (<span class="hljs-params"></span>)</span>{ <span class="hljs-comment">// アクセス可能</span>
    }
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">_secret_method</span> (<span class="hljs-params"></span>)</span>{ <span class="hljs-comment">// アクセス不可（404）</span>
    }
}
</code></span></pre>


<p>アクセスされる事が好ましくないメソッドは、<br />
プライベートメソッドとして宣言しておきましょう。</p>



<p>以上です。<br />
日々注意しつつ、安全なアプリケーション制作をこころがけましょう！<br />
（と、主に自分に言い聞かせる）</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
