The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

security セキュリティ

DESCRIPTION

このドキュメントは、TripletaiL を利用する際、どのようなセキュリティ上の問題に配慮すべきかについて記述しています。

Cross Site Scripting (クロスサイトスクリプティング、XSS)

タグ文字が差し込まれるのを防ぐ

ユーザの入力を画面に表示する際に、"<" や ">" などのHTMLタグがそのまま表示されないように注意します。

Template クラスを使用します。

TripletaiL の Template クラスを使用し、ユーザ入力の展開に expand や add メソッドを利用します。

これらのメソッドは、デフォルトで "<" や ">" を "&lt;" や "&gt;" に置き換えます。 これらの置き換えを行いたくない場合は、setAttr メソッドで動作を変更できます。

ただし、_raw などを使用する際には、十分注意して下さい。 ユーザの入力に対して、一部のタグだけを許可したり、URLのリンクだけを許可したい場合は、TagCheck クラスが利用できます。

<script><&DATA></script><a href="" <&DATA>> のような部分に展開しないようにします

テンプレートで展開する場所が安全かどうかを確認します。

setAttr メソッドで "<" や ">" を安全に置き換えても、script タグの中に文字列を出力したり、タグの中に文字列を出力してしまうと、 スクリプトの実行が可能になってしまいます。

URLの指定に注意します

<a href="javascript:XXX">などにならないように、URL が「http://」や「https:://」から開始されていることを確認してから、差し込んで下さい。

SQL Injection (SQLインジェクション)

SQLを組み立てる際に入力パラメータをそのままSQL文の中に入れてしまうと、条件を回避したり、任意のクエリを実行できることがあります。

SQLを発行する際は、動的にSQLを組み立てる場合も含め、必ずパラメータをプレースホルダ "?" 経由で引き渡すようにします。 TripletaiL では、拡張プレースホルダ "??" を利用することで、LIMIT句などにも簡単に変数経由で値を渡すことが出来ます。

テーブル名等をパラメータで指定しなければならない場合は、余計な文字が入らないことを十分に確認してから、SQL文の中に差し込んで下さい。

Cross Site Request Forgeries (クロスサイトリクエストフォージェリ、CSRF)

認証済みのユーザに特定のアクセスをさせることで、意図しない操作(記事の書き込み・削除等)をさせる手法です。

重要な操作をする場合は、その前の確認画面で Template クラスの addSessionCheck メソッドを利用して、セッションIDを利用したキーを埋め込みます。 確認画面をクリックした後、フォームデータを受け取った側では、$CGI->haveSessionCheck メソッドを利用して、正しい利用者のキーが埋め込まれているかを確認します。

Session Hijacking / Replay (セッション・ハイジャック/リプレイ)

セッションを読み取り、ユーザになりすます手法です。

特に、HTTP領域では、通信内容を第三者に閲覧される可能性があるため、セッションハイジャックの可能性が残ります。

サイトを設計する際は、重要な機能は全て HTTPS領域に配置し、 セッションのmode double または https モードにする必要があります。 http モードはセッションハイジャックに対して安全ではないので、重要な情報を取り扱う場合は利用しないで下さい。

TripletaiL のセッションは、double モードであれば、HTTP領域、HTTPS領域にまたがってセッションを利用しても、 httpで閲覧した内容を用いて、HTTPS領域のセッションをハイジャックすることが出来ないようになっています。 このため、HTTP領域では差し支えのない範囲でセッションを利用し、重要な機能をHTTPS領域で安全に提供することができます。

携帯でのセッション利用における注意事項

携帯用に Tripletail::Filter::MobileHTML を利用している場合は、 セッション情報がフォームに出力されるため、セッション情報の 漏洩に関して特に注意する必要があります。

外部サイトにリンクをする際に、セッションで管理されているページから 直接リンクをたどれるようにしてしまうと、外部サイトに対し、 ブラウザが Referer ヘッダで直前の(セッション情報が入った)URLを 送ってしまうため、セッション情報が漏洩します。

外部へリンクする際は、一度セッション情報を付けずに自サイトの 別ページに遷移してから、目的の外部ページへ遷移させます。

Tripletail::FormtoExtLink() を利用してリンクを作成するか、 "INT" キーを含まないURLを直接HTMLに書くことで、 セッション情報を付けずにページを遷移させることが出来ます。

また、HTTP領域とHTTPS領域の行き来を安全に行うことも出来ません。

Forceful Browsing (強制的ブラウズ)

直接若しくは間接的に公開する意図のないファイルを、 その位置を直接指定することで参照する手法です。

ini ファイル等は外部から参照できる場所(DocumentRoot以下など)には おかないようにしてください。

Path Traversal (パスの乗り越え)

CGIに渡されるパラメータをパスに指定している際に、本来アクセスできない位置のファイルを読まれてしまう問題です。

open関数など、通常のファイル操作を避けて、テンプレートは全てテンプレートクラスを利用するようにして下さい。

テンプレートクラスは、basepathrootpath で、アクセスするディレクトリを指定・制限することが出来ます。 この機能を利用し、テンプレートは他のファイルと別のディレクトリに配置するようにして下さい。

OS Command Injection (OS コマンドの挿入)

パラメータに渡されたデータをopen等に渡す場合に、OSコマンドを実行されてしまう問題です。

open関数など、通常のファイル操作を避けて、テンプレートは全てテンプレートクラスを利用するようにして下さい。

Session Fixation 攻撃 (セッション固定攻撃)

攻撃者が生成したセッションIDをユーザに使用させ、そのユーザになりすます手法です。

TripletaiL では、デフォルトでは Sessionクラスの setValue で値を変更した場合、セッションIDは自動的に更新されるので安全です。

Session クラスの ini 設定で、setvaluewithrenew0 に指定すると更新されなくなるため、0 に指定する場合は、適宜 renew メソッドでセッションIDを更新する必要があります。

また、setValue より多くのデータを扱うために、独自にテーブルにセッションIDに関連した情報を保持している場合は、renew の動作に注意して下さい。

setValue で認証のための情報をセットするような設計にしておき、認証情報が変わった場合は自動的にrenewされるような構成にすることを推奨します。

dispatch による意図しない関数呼び出し

dispatch メソッドは、 "Do" + "与えられた引数" という名前に一致した 関数を呼び出します。

パッケージ内に "Do" から始まる関数があると 意図せずに呼び出される可能性があるので注意してください。

バージョン 0.30以降では、引数に渡せる名前は大文字始まりに 制限されていますが、0.29 以前ではこの制限がないため、 他の単語の一部に "Do" が含まれる関数も呼び出される可能性があります。 (例: DoneXxx, DomainCheck, DocumentCreate, Download)

AUTHOR INFORMATION

    Copyright 2007 YMIRLINK Inc. All Rights Reserved.

    This framework is free software; you can redistribute it and/or modify it under the same terms as Perl itself

    このフレームワークはフリーソフトウェアです。あなたは Perl と同じライセンスの 元で再配布及び変更を行うことが出来ます。

    Address bug reports and comments to: tl@tripletail.jp

    HP : http://tripletail.jp/

1 POD Error

The following errors were encountered while parsing the POD:

Around line 73:

L<> starts or ends with whitespace