CI3のXSS対策について

358 views
Skip to first unread message

Masamitsu terasawan

unread,
Dec 17, 2015, 9:10:12 PM12/17/15
to codeigniter_jp
xss_cleanについて、どのように利用すべきか整理できていないため
もし詳しい方がいらっしゃいましたら、以下について教えていただきたいです。

1. xss_clean の利用について
global_xss_filteringは、CI3ではDEPRECATEDとされているようで、
積極的に利用する必要はないという認識です。

ですが、XSS filteringはinputではなく、output時に利用するものだという記載について
具体的にどのようにすべきか理解できていません。

以下のようなメソッドの第二引数にTRUEを指定するケースというのは
入力データをそのままviewなどに出力する場合ということでしょうか?

$this->input->post()
$this->input->get()
$this->input->cookie()
$this->input->server()


2. html_escape について
以下で、htmlspecialchars との比較がされていますが(CI2のようですが)
CodeIgniter ユーザが CodeIgniter の XSS フィルタについて知るべき 5つのこと - A Day in Serenity @ kenjis 

基本的には出力時には html_escape を用いるべきという認識ですが
合っていますでしょうか?

また、少し話がぞれますが、Railsのように全ての出力用変数に自動でescape処理をかける実装というのは
CIでは難しいのでしょうか?

Kenji Suzuki

unread,
Dec 18, 2015, 7:08:00 AM12/18/15
to codeigniter_jp
Kenji です。


On Thu, 17 Dec 2015 18:10:12 -0800 (PST)
Masamitsu terasawan <tera...@gmail.com> wrote:

> xss_cleanについて、どのように利用すべきか整理できていないため
> もし詳しい方がいらっしゃいましたら、以下について教えていただきたいです。
>
> 1. xss_clean の利用について
> global_xss_filteringは、CI3ではDEPRECATEDとされているようで、
> 積極的に利用する必要はないという認識です。
> https://github.com/bcit-ci/CodeIgniter/commit/9187ed3516ba403d09fc88ebcf6ead7364f75c4d
>
> ですが、XSS filteringはinputではなく、output時に利用するものだという記載について
> 具体的にどのようにすべきか理解できていません。
>
> 以下のようなメソッドの第二引数にTRUEを指定するケースというのは
> 入力データをそのままviewなどに出力する場合ということでしょうか?
>
> $this->input->post()
> $this->input->get()
> $this->input->cookie()
> $this->input->server()

私の意見では XSS filtering を使うケースはありません。

XSS filtering は過去何度も何度も脆弱性が指摘されて修正されて
おり、根本的に安全かどうかは疑問があります。

ただし、もし上記のメソッドの第二引数にTRUEを指定するなら、
その返り値をそのまま view で表示することになると思います。

XSS filtering にバグがなければ、XSS されないことが保証されます。


> 2. html_escape について
> 以下で、htmlspecialchars との比較がされていますが(CI2のようですが)
> CodeIgniter ユーザが CodeIgniter の XSS フィルタについて知るべき 5つのこと - A Day in Serenity @
> kenjis
> http://d.hatena.ne.jp/Kenji_s/20110709/1310163972
>
> 基本的には出力時には html_escape を用いるべきという認識ですが
> 合っていますでしょうか?

そうです。出力時にすべてエスケープするというのが一般的な XSS 対策です。

ただし、出力するすべての変数に html_escape() を適用するという
アプローチは漏れが生じやすいのでお薦めしません。

http://blog.a-way-out.net/blog/2015/06/23/codeigniter-tetti-xss/
参照。


> また、少し話がぞれますが、Railsのように全ての出力用変数に自動でescape処理をかける実装というのは
> CIでは難しいのでしょうか?

標準だと CI のビューは生の PHP なので、ビューに渡すときに変数を自動エスケープ
する処理をどうにか追加するというアプローチが考えられますが、これはオブジェクトを
どう処理するかという問題があり、あまりお薦めしません。

ビューでの出力時に専用の出力関数を用意してそれでエスケープして出力するという
アプローチの方が簡単だと思います。ビューに echo $var; とか書かれたら XSS に
なる可能性ありますが、echo などが使われていないかどうかは、ビューをチェック
すればわかりますので。

いずれにしても、CI に自動エスケープの機能はありません。


それから、Rails は ERB だと思うので、テンプレートエンジンを使っているという
ことかと思います。CI でもテンプレートエンジンを使えば簡単にできます。

通常は Twig なり Smarty なりを使い、テンプレートエンジンの機能で自動エスケープ
するのが一般的であり、そのような方法をお薦めします。


// Kenji

Masamitsu terasawan

unread,
Dec 18, 2015, 7:38:19 AM12/18/15
to codeigniter_jp
terasawaです。

Kenji さんご返信ありがとうございます。
大変参考になります。

私の意見では XSS filtering を使うケースはありません。
 やはり、そうですよね。安心しました。
 
 > 2. html_escape について 
> 基本的には出力時には html_escape を用いるべきという認識ですが
> 合っていますでしょうか?

そうです。出力時にすべてエスケープするというのが一般的な XSS 対策です。

ただし、出力するすべての変数に html_escape() を適用するという
アプローチは漏れが生じやすいのでお薦めしません。

http://blog.a-way-out.net/blog/2015/06/23/codeigniter-tetti-xss/
参照。
 
> また、少し話がぞれますが、Railsのように全ての出力用変数に自動でescape処理をかける実装というのは 
> CIでは難しいのでしょうか?

標準だと CI のビューは生の PHP なので、ビューに渡すときに変数を自動エスケープ
する処理をどうにか追加するというアプローチが考えられますが、これはオブジェクトを
どう処理するかという問題があり、あまりお薦めしません。 
 
 ビューでの出力時に専用の出力関数を用意してそれでエスケープして出力するという 
アプローチの方が簡単だと思います。ビューに echo $var; とか書かれたら XSS に
なる可能性ありますが、echo などが使われていないかどうかは、ビューをチェック
すればわかりますので。

いずれにしても、CI に自動エスケープの機能はありません。


それから、Rails は ERB だと思うので、テンプレートエンジンを使っているという
ことかと思います。CI でもテンプレートエンジンを使えば簡単にできます。

通常は Twig なり Smarty なりを使い、テンプレートエンジンの機能で自動エスケープ
するのが一般的であり、そのような方法をお薦めします。 
ありがとうございます。テンプレートエンジンを利用する方法で検討します。
 
Reply all
Reply to author
Forward
0 new messages