v1.8.0においてSecurity::htmlentities がDBから取得した値をエスケープしない

67 views
Skip to first unread message

uratch

unread,
Aug 2, 2017, 6:46:22 AM8/2/17
to fuelphp.jp
こんにちは。
表題の通り

  $sql = ' SELECT * FROM tbl ';
  $sql = DB::query($sql)->parameters($param);
  $result = DB::query($sql)->execute();
  return $result;

みたいな感じでモデルから取得した <script>alert("foo");</script>; みたいなデータが
viewに渡った際にエスケープされないようです。
viewには以下のようにコントローラでノーマルな渡し方をしています。

  $this->template->yield = View::forge('index', $data);

コントローラ内で他の変数も渡して試してみましたが、それらは問題ありませんでした。

  // String型変数:view で<?=$text?>参照でエスケープ済み確認OK
  $data['text'] = '<script>alert("foo");</script>';

  // オブジェクト:view で<?=$obj->text?>参照でエスケープ済み確認OK
  $obj = new stdClass();
  $obj->text = '<script>alert("bar");</script>';
  $data['obj'] = $obj;

  // 配列:view で<?=$arr[0]?>参照でエスケープ済み確認OK
  $data['arr'] = array(0 => '<script>alert("fuga");</script>');

皆様は再現しませんでしょうか?

Message has been deleted

uratch

unread,
Sep 3, 2017, 6:06:28 AM9/3/17
to fuelphp.jp
自己解決しました。
本件、PDOでは起きず、mysqliで発生する事象でした。
開発者もなかなか理解して貰えなかったのですがようやく確認済です。

https://github.com/fuel/core/issues/2067

そして、更に追加でバグ懸案をみつけました。
Model_Crudを利用したfind_by_pk() でも同様にXSSエスケープが漏れています。
こちらもissueに追記しています。

当方のシステムでは、mysqli::SQL文とModel_Crud::find_by_pk()のみ対象だったのでこちらだけ検証しましたが、
開発者とのやり取りから察するに、他のケースでもエスケープ漏れがある可能性があるように思われます。
ご自身のシステムのチェックをされる事をお勧めします。





2017年8月2日水曜日 19時46分22秒 UTC+9 uratch:
Reply all
Reply to author
Forward
0 new messages