FuelPHPのVerが1.5.1の話題です。

結論から書くとconfig.phpの設定は
'htmlentities_double_encode' => true,
'uri_filter'       => array(),
がいいんじゃないかなと思います。
※こうしたときにFieldsetクラスがうまく動かないかもしれないです。
 ごめんなさい、試してません。


FuelPHPのhtmlentitiesの第四引数(double_encode)のデフォルトはfalseです。
ちなみにPHPのデフォルトはtrueです。

FuelPHPのソースは以下のようになっています。
\core\classes\security.php
public static function htmlentities($value, $flags = null, $encoding = null, $double_encode = null)
{
static $already_cleaned = array();

is_null($flags) and $flags = \Config::get('security.htmlentities_flags', ENT_QUOTES);
is_null($encoding) and $encoding = \Fuel::$encoding;
is_null($double_encode) and $double_encode = \Config::get('security.htmlentities_double_encode', false);

以下略 


double_encodeの意味は以下の通りです。

double_encode

double_encode をオフにすると、PHP は既存の html エンティティをエンコードしません。 デフォルトでは、既存のエンティティも含めてすべてを変換します。


何を言っているかというと、double_encodeがtrueの場合は、「&」と入力があったら「&」となりますが、falseの場合は、「&」と入力があったら「&」のままとするということです。

FuelPHPの場合、
 <?php echo Form::input('name', Input::post('name')); ?>
のように書いてフォームを出力します。
$_POST['password']の値が「&amp;」だと、本当は「&amp;amp;」として出力しないといけないのに「&amp;」と出力してしまうので、フォームのinputには「&」と表示されてしまいます。

&amp;や&gt;を入力する機会はほぼない気もいたしますが、入力されるケースがある場合、なぜ&amp;と入力した結果が&になってしまうか気がつかないと思います。

FuelPHPのdouble_encodeはconfig.phpで変更可能です。
config.phpのhtmlentities_double_encodeはtrueにした方がいいと思います 。

この変更に伴って
//'uri_filter'       => array('htmlentities'),
'uri_filter'       => array(),
としないといけません。

FuelPHP でのセキュリティ対策(1) - A Day in Serenity @ kenjisのURI フィルタの記載の通りで、uri_filterにhtmlentitiesを適用されているので、&等を含むURLは自動的にhtmlentitiesが適用されて、コントローラーで受け取った時点で、HTML エンティティに変換されてしまいます。
これをViewに渡すと、htmlentities_double_encodeがtrueの場合、もう1回htmlentitiesが適用されてしまいます。

※FuelPHPの思想は、URLをコントローラーで受け取った時点で、&等がHTML エンティティに変換されているべきだ、ということだと思うのですが、kenjisさんがFuelPHP Forumsで質問しているとおり、私もデフォルトの uri_filter の必要性がわかりません…