引用/参考書籍
「Webアプリエンジニア養成読本」
最低限のセキュリティ対策(WEB)
WEBアプリを制作する上で最低限気を付けなければ
ならないセキュリティについての学習です。
不正なアクセスやトラブル、またユーザの操作
によって第三者に被害を与えてしまうことを防ぐ、
セキュリティの確保がWebアプリにも必要です。
ここで、代表的なセキュリティホールを2つほど
紹介し、対策を考えていきます。
ちなみに運用時のサーバにおけるセキュリティ
対策も必要ですが、今回は触れません。
XSSの概念と対策
クロスサイトスクリプティング(XSS)とは、
ユーザがフォームなどで情報を入力する
Webアプリがあり、入力→送信されたデータを
再びユーザにHTMLとして描画する際に
不適切な処理を行っている為に
何かしらの攻撃に繋がってしまうことを
指します。
最も顕著なのが、
他人のWebサイトへ、悪意のあるスクリプトを埋め込むこと。
JavaScriptのコードが埋め込まれているテキスト
を「そのまま」HTMLとして描画すると、
意図せず実行されてしますケースです。
開発者側としてはマークアップされていない
文章をフォームに入力してもらいたいはずが、
そこにJavaScriptのコードが書かれていたら
どうでしょう。
JavaScriptが実行されることを応用すると、
ブラウザに保存されているクッキーの値を取得したり
表示を強制的に書き換えたり、勝手にデータを送信
したりという可能性があります。
セキュリティホール①
「危険」なのでXSS対策を行う
基本的には、ユーザーから投稿されたテキスト
に書かれたHTMLのタグを実行させないために、
文字列をサニタイジング(エスケープ)させます。
※サニタイジング:入力データの無害化。
※エスケープ:特殊文字を適切な文字列に置換。
たとえば、
HTMLではタグを**< **と** >**でくくりますが、
それらを文字参照を使い**<と>**に変換
させてやるのです。
するとWebブラウザはタグと解釈はせずに、
**< **と** >**を表示してくれます。
HTMLサニタイジングは、Webアプリケーション
フレームワークの「テンプレート」という
機能にデフォルトで導入されていて、
とくに意識せずとも「勝手に」サニタイジング
されていることが多いですが、
それに頼るだけでなく、XSSの原理と
対策を把握しておくことが大事。
自分でやるには、まず前提として
「サーバーサイドのプログラム言語(PHP、Ruby等)」
を使える事が必要です。
具体的な対策のやり方
ユーザーが入力した値(テキストやaタグ(URL)、imgタグ(画像)に対して)
をそれぞれのプログラム言語に
用意されている。関数に通せば済みます。
例としてPHPとRubyの関数を紹介します。
PHP
htmlspecialchars($str, ENT_QUOTES, ‘UTF-8′);
if (substr($_POST['url'],0,10) == "javascript:") {
die("Illegal URL!\n");
}
Ruby
sanitize(文字列 [, tags => "許可するHTMLタグ名", attributes => "許可するHTML属性名"])
CSRFの概念と対策
CSRFはクロスサイトリクエストフォージュリ
の略で、悪意ある人がユーザに被害を与える
攻撃方法です。
攻撃を受けた場合、勝手に掲示板へ書き込み
をしたり、クレジットのオンライン決済を
したりという可能性があり「危険」です。
セキュリティホール②
CARFを防ぐ為に、一つは、
フォーム表示する際、type属性の値が
hiddenであるinput要素の値に、
セッションIDなどの攻撃者が知り得ない
秘密の文字列を入れて、webアプリ側で照合することです。
XSSと同じく、フレームワークが対策用の
機能、ライブラリを提供しているので、
実装する場合はそちらを使うとよいです。
※「hiddenフィールドは画面には表示されず,
複数のWebページ間でデータの受渡しを
行う際に利用されるHTMLフォーム項目である。」
わたしのような個人制作者は、セキュリティの部分
など、疎かにしてしまいがちです。
自分で注意し、自分や第三者が困る事のないよう
心掛けたいところです。