全てのWEBサービスでチェックすべきセキュリティ項目

By Gozal 運営事務局 2015.05.01

WEBサービスにおけるセキュリティ対策の基礎

近年WEBサービスの脆弱性が騒がれておりますが、果たしてあなたが運用しているサイトのセキュリティは大丈夫でしょうか?以下、チェックしておくべきセキュリティ項目をあげました。



SSL証明書の利用

ユーザのプライベートな情報を送信してもらいサーバに保存するようなサービスではSSL認証は必須の機能と言えるでしょう。SSL認証を行っていないと、大切なユーザの情報が外部の悪いユーザに見られてしまう可能性があります。

※ちなみにGozal-mediaではプライベートな情報のやり取りは行っていないためhttpで通信を行っています。


【確認方法】

・ユーザ情報を送受信するページのURLが「https」から始まっている事を確認
・「https」のページにアクセスした際に「セキュリティ証明書が信頼できない」という用な表示が出てこない事を確認


【導入方法】

導入方法は非エンジニアでも分かるSSL通信の仕組み ~httpsって何?~をご参照ください。


IDやパスワード入力後のエラーメッセージに気をつける

IDやパスワードを入力してログインする場合や、メールアドレスを登録する場合に、
エラーメッセージとして

「IDが間違えています」
「パスワードが間違えています」


等と個別にエラーメッセージを表示をしたり

「すでに登録されているメールアドレスです」
「すでに登録されているIDです」


等と登録されている事を教えるエラーメッセージになっている場合は要注意です。

IDやパスワードどちらかが合っている事が分かるだけでも総当たり攻撃(ブルートフォースアタック)によりIDやパスワードが漏洩してしまう原因となります。


■ 秘密情報のエラーメッセージは一つの文言に集約し
■ 「ID又はパスワードが入力されていないか間違えています」等と曖昧な表現にとどめておきましょう。


ブラウザに搭載されている機能であるオートコンプリートに関する対策

オートコンプリート機能とは、ブラウザ上でフォームから入力した情報をブラウザに保存する機能で、入力履歴情報としてリスト表示する事が出来てしまいます。
デフォルトでブラウザに搭載されている機能なので、機密情報を管理しているのに対策を行っていない場合は注意が必要です。

良く見かける、「ブラウザに入力項目を保存しますか?」のポップアップが出るのがオートコンプリート機能です。


オートコンプリート機能を使用すると、IDを入力するだけでパスワードは自動で入力されてしまいます。
ネットバンキングや機密情報を扱う場合はオフにしておくのがセキュリティ上好ましいでしょう。

※追記
一方「autocomplete="off" すると簡易なパスワードへの変更をする方が増え、セキュリティは下がってしまう」という意見もあります。offにした場合はパスワードは複雑な文字列のみ受け付ける等の対策が必要そうです。

保存した場合のIDやパスワードの確認方法は下図です。



【対策】
下記のように「autocomplete=“off”」をつけるだけです。



秘密情報をhiddenでhtmlに埋め込まない

ユーザ情報を登録する際の確認画面を挟む際に注意しなければならない点です。
IDやパスワード等のユーザの重要な秘密情報をユーザの入力した情報のままブラウザに送り返して表示していると、ユーザのブラウザ側にてテンポラリファイル(ブラウザが勝手に保存してくれるファイル)として秘密情報が残ってしまいます。
これを他のユーザに見られてしまうとアカウントが乗っ取られてしまう危険性が出てきます。

【確認方法】
Chromeで確認している場合、 各ページで「右クリック」→「ページのソースを表示」で簡単に各ページのソースを表示する事が出来ます。

その中にパスワード等の秘密情報がhiddenパラメータで組み込まれていないか確認しましょう。


【対策】
下記2通りの対策が考えられます。
■ IDやパスワードを確認ページにてもう一度入力してもらう
■ 確認画面等でIDやパスワードをユーザに送り返さない


エラーメッセージを表示しない

エラーが起きた際のエラーメッセージはサーバ内部の情報(osや使っているフレームワーク等)漏洩につながるので、 例外処理としてエラーページに飛ばすようにしましょう。

apacheでサービスの運用をしている場合(httpd.confの設定変更)



等の対策を行う事になります。
エラーページにリダイレクトさせるのは同設定ファイル内のErrorDocumentの設定になります。
※アプリケーションサーバを利用している場合は各アプリケーションサーバ側でもエラーハンドリングを行う必要があります。

XSS(クロスサイトスクリプティング)対策

WEBサービスの攻撃の一つにXSSというものがあります。
これは攻撃者があらかじめ用意された悪意のあるプログラムを一般ユーザに実行させる事が可能となってしまう攻撃なので、対策を行う必要があります。

【確認方法】
ユーザが入力を行えるフォームに下記文字列を入力

入力後に入力した項目が確認できるページを開く
alertが出てこない事を確認。


※追記
XSSがおこる可能性は多種に渡るため下記のようなチェックや対策が必要になるケースもあります。
機能追加に伴いXSSのパターンも多様化しています。新しい言語や機能を使用する場合はくれぐれもご注意ください。
■ シングルクォートを使用した場合

■ ダブルクォートを使用した場合

■ imgタグのsrc属性にJavaScriptを使った場合

■ IE限定でスタイルシートの柔軟性によるXSSが生じる場合

■ JavaScriptに入力データが動的に埋め込まれている場合

■ XMLHttpRequest(XHR)によってJSONをやりとりしている場合
※この場合は下記2つの対応をする必要があります。
・レスポンスヘッダにX-Content-Type-Options: nosniffをつける。
・XHRからのリクエストのみに対応するようにする。


【対策】
ユーザが入力を行える部分に関して、入力データの検証を行う
「<」や「>」「’」「”」「&」等が入力データに含まれている場合は例外処理とするか、エスケープ処理(問題のない文字列に置き換える)を行う必要があります。(2014/05/06 エスケープする文字一部修正しました)

【注意点】
ユーザの入力等に確認ページを挟んでいて、そこから「戻るボタン」を押すような構成になっている場合に戻り先のページにて上記処理が抜けているケースがよくあります。


CSRF(クロスサイトリクエストフォージェリ)対策

ユーザが情報を更新する際に、ランダムな文字列を生成していない事でユーザが意図しない更新が行われる可能性がある脆弱性です。

例えば以下の用な情報送信用のページがサービス内にあった場合、



上記の用なHTMLだと、上記のフォームが埋め込まれた全く関係のないサイトにユーザがアクセスした場合にサービス内の情報が更新されてしまうという事になってしまいます。 なので、本来であれば



等のように更新する度に変更されるようなランダムな値を一緒に送信し、 サーバ側で自分のサイト内からのアクセスかどうかを調べる必要があります。

【確認方法】
下記2点のいずれかが行われていれば問題ありません。
■ 更新ページ前のページにランダムな文字列を生成している形跡があるかをチェックする
■ 更新の際に、パスワード認証を行っている


SQLインジェクション対策

WEBサービス内でDBにデータを保存している際に、DBへの命令文であるSQLを好き勝手に実行されてしまう脆弱性です。

基本的に各プログラミング言語にはプリペアードステートメントというものが用意されており、 それを利用していればユーザが入力したパラメータを処理してからSQL文を実行する事になるので問題はありません。

サービス内でDBを扱っているのに「あれ、、プリペアードステートメントって何ぞや?」という方は、SQLインジェクションの脆弱性を抱えている可能性があるのでソースコードをチェックしましょう。
また検索機能等を実装する際にプリペアードステートメントを動的に生成したりしている場合は、ユーザの入力に対してしっかりとエスケープ処理を忘れないようにしましょう。



OSコマンドインジェクション対策

OSコマンドインジェクションとはユーザの入力によって、サーバ内のOSコマンド(ls、find、cat、gcc等)を実行できるようにしている場合に、 自由にOSコマンドの実行が出来たり、OSコマンドに渡されるパラメータを操作できたりしてしまう脆弱性です。

OSのコマンド処理を組み込んでいないWebアプリケーションでは問題ありませんが、 OSコマンドインジェクションは最大限警戒しなくてはならない脆弱性なので、なるべくOSコマンドを使わない方法を検討する必要があります。
※PerlやRuby、PHPにてsystem()関数を使っている場合は、コマンドを操作していると考えられるので、注意が必要です。

どうしても組み込む必要がある場合は各言語で用意されているエスケープ用の関数(PHPならescapeshellrg())を使用し、ユーザが入力できる文字列をホワイトリスト形式で絞り込みましょう。


セキュアなサイト作成のための注意点

色々と書きましたが、一般的なWebサイトを作成する際は以下の6点に気をつけるようにしましょう。

■ 無駄な機能は実装しない。必要最低限のコードになるように実装する。
■ 公開すべきでない情報にはアクセス制限やパスワード認証等を着けて外部からアクセスできないようにする。
■ エラー情報をむやみに出さない。
■ 個人情報(ログイン情報、クレジットカード情報等)に関しては最新の注意を払って実装する。
■ 入力データに対するエスケープのみでなく、出力データに関しても問題がないかチェックする。
■ 入力データに関して、どのような入力がなされても問題ないように実装する。

また、社内にて管理者がセキュリティに関するチェック項目等をもうけ、一定のルールを元にした管理体制をつくっていく事も大変重要となります。

日経新聞
TechCrunch
The bridge
日経産業
IT PRO
会計ナビ
NIKKEI
日刊
cnet
yahoo