【初心者目線】Webアプリケーションの開発 最終回
【初心者目線】Webアプリケーションの開発 最終回について書きます!
1. セキュリティ対策
Webアプリケーションを開発するにあたり、セキュリティ対策は最も考慮しなければならないポイントの1つです。
ショッピングサイトや金融取引を行うWebアプリケーションを開発する際には特に留意しなければなりません。
ここからはセキュリティリスクやセキュリティ向上のための技術を紹介していきます。
1-1. 情報流出
第三者への情報流出は良く発生するセキュリティリスクですが、一例としてショッピングサイトが管理している顧客のクレジットカード情報が流出し悪用されるケースがあります。
またログイン情報が流出すると、サーバ攻撃などに発展する可能性もあります。
顧客への被害はもちろんですがシステムを運営する企業の信頼も失墜し、会社の経営に影響を与えることもあります。
1-2. 情報改ざん
第三者がシステムの情報を改ざんすることにより、利用者や運営する企業に不利益を与えることがあります。
例えば銀行の送金システムに不正アクセスし口座残高を変更するなどの事例があります。
また、Webサイトを改ざんして情報を盗み取ったり、コンピュータウイルスを感染させるなどの問題も発生しています。
2. Webアプリケーションへの攻撃と対策
現在Webアプリケーションに対する様々な攻撃方法が生み出されています。
これらの攻撃からシステムを守るためには、攻撃手法と攻撃による影響、それを防ぐための技術を習得する必要があります。
ここでは代表的な攻撃手法について対策とともに説明していきます。
2-1. SQLインジェクション(手法)
これは、フォームの入力欄などを利用してデータベースに発行するSQLに対し、開発者が意図しない形に変更しデータベースに不正アクセスする方法です。
下図はショッピングサイトのログイン画面で、ユーザIDとパスワードがそれぞれ「userID」と「password」という変数に格納されており、文字列結合によりユーザIDとパスワードを検索するSQLを組み立てています。
ユーザ名とパスワードに上図のような文字列を入力します。
パスワードに「test’ or ‘1’=‘1」という文字列を入力することにより、where句に「or ‘1’=‘1」という条件が追加されます。
これは「1=1」という常に等しくなる条件を付与することにより、ユーザIDやパスワードが一致しない場合でも全ての結果が取得できるようにした攻撃方法です。
ログイン画面のログイン成否判定が、上記のSQLで1件でもデータが取得できた時にログイン成功とするロジックの場合、ユーザIDやパスワードが分からない場合でもログインが成功してしまいます。
この方法は不正ログインだけでなくデータの改ざんや、本来閲覧できない情報の表示などもできてしまいます。
2-2. SQLインジェクション(対策)
また専用の攻撃ツールも存在するため非常に恐ろしい攻撃手法とも言えます。
ここからは、この攻撃に対する対策を紹介していきます。
・入力値の制御
ログイン画面のパスワード入力欄で入力値の制御(チェック)を行い、半角英数字以外の入力をさせないようにすれば、SQLインジェクションで利用される「’」の入力を防ぐことが出来ます。また、これらのチェックはフレームワークが提供する「バリデーション」という機能で自動的に行うこともできます。
・プリペアードステートメント
プリペアードステートメントとは文字列結合でSQLを作成するのではなく、Where句などの可変部分を変数のようにしたSQL文をあらかじめ作成しておき、あとからパラメータを割り当てる(バインドする)方法です。以下はプリペアードステートメントを利用したSQLの発行例を表したものです。
プリペアードステートメントの設定をしている箇所のSQLで、「?」の部分がプレースホルダになっています。
文字列結合のSQL生成と異なる点は、SQLの解釈を先に実行することにより条件の追加などが後から行えないことです。これによりSQLインジェクションの防止ができます。
また、プレースホルダの部分を後から差し替えられるようにすることで、DBアクセスの実行効率が向上します。
2-3. クロスサイトスクリプティング(手法)
WebサーバからWebブラウザに返されるHTMLレスポンスに悪意のあるJavaScriptが埋め込まれると、Webブラウザでそのスクリプトが実行され、Cookieの盗難やWebページの改ざんなどをされてしまい、不正ログインや個人情報の流出が発生してしまいます。
上図のようにログインフォームなどに入力した文字列を、そのままHTMLに出力しているWebサイトでは、XSSの標的にされやすくなります。
試しにユーザIDに「<script>alert(‘nekonoesa’);</script>」と入力してみると、商品一覧画面にダイアログが現れ「nekonoesa」という文字列が表示されます。
これだけでは問題ないように思えますが、このような脆弱性があるWebサイトが悪意のある人物に発見された場合、大きな問題に発展します。
攻撃者が用意したサイトに脆弱性のあるWebサイトへのリンクを用意し、GETリクエストでJavaScriptを脆弱性のあるWebサイトに渡すようにしておきます。
ユーザがこのリンクをクリックすると悪意のあるスクリプトが実行されてしまいます。(上図参照)
その結果、偽のログインページに誘導されて入力したパスワードを盗み取られたり、Cookieの内容が盗まれたりします。
2-4. クロスサイトスクリプティング(対策)
これはHTMLに文字列を埋め込む際にHTMLの構造を変更したり破壊してしまう文字列を、無害な文字列に変換する処理のことを言います。
以下にサニタイジングの例を表します。
サニタイジングはHTMLであれば「<」「>」「&」「”」「’」といった文字が無害化の対象になります。
SQLでは「’」「--」という文字列が無害化の対象になります。
このように出力対象により無害化対象の文字が異なるため、対象に合わせた処理が必要になります。
また、サニタイジングのタイミングにも注意しなければなりません。
一般的にサニタイジングによる文字列のエスケープはHTMLを出力する直前に行います。
理由は、文字列を受け取った直後にエスケープしてしまうと、入力した文字列を使用した入力値チェックなどの処理に影響が出てしまうからです。
サニタイジング処理は実行環境やフレームワークが機能を提供している場合もあります。
例えばPHPでは「htmlspecialchars」という関数を使用すると、引数にセットされた文字列からHTMLの特殊文字列を置き換え無害化してくれます。
2-5. セッションハイジャック(手法)
例えば「田中さん」が利用しているWebアプリケーションが「利用者は田中さんである」と判断するための情報はセッションIDのみですが、このセッションIDが第三者に知られた場合、田中さんになりすましてそのWebアプリケーションを使用することができてしまいます。
このようにセッションIDが盗まれると、田中さんの個人情報が流出したり、本人になりすまして商品を不正購入される被害も発生します。
2-6. セッションハイジャック(対策)
気づかないうちに大きな被害を受ける可能性が高いセッションハイジャック攻撃ですが、これらの攻撃を防ぐためには以下の対策を行うことが推奨されています。
・XSS対策
クロスサイトスクリプティング(対策)の説明で詳細は記述したのでこちらでの説明は省きますが、セッションハイジャックの手段としてXSS攻撃が最も多く用いられています。
よってXSS対策をすることにより、セッションハイジャックへの対策にもつながります。
・通信の暗号化
インターネット上を流れる情報は特殊なソフトウェアなどによって傍受することができます。
よって、セッションIDも第三者に盗まれる可能性があります。
これを防ぐためには「SSL」という技術により通信を暗号化する必要があります。
・セッションタイムアウトの設定
セッション情報は明示的に廃棄されない限り、タイムアウトが発生するまでサーバ側に保持されます。
例えば、Webアプリの利用者がログアウトを忘れた場合、セッションタイムアウトが発生するまでセッションIDも有効なため、セッションハイジャックの被害を受けやすくなります。
よって、重要な情報をやり取りするWebアプリケーションでは、セッションタイムアウトの時間を短めに設定しセッションIDが盗まれた際の危険性を下げておく必要があります。
ただし、短くしすぎると少しの間操作をしないだけで操作をやり直すことになるため、安全性と利便性のバランスの考慮が必要です。
3. 最終回 まとめ
最終回はセキュリティについて解説してきました。
Webアプリケーションに対する攻撃には多種多様なパターンが存在します。
そのすべてを解説するのは非現実的なため、その中から有名な攻撃パターンとその対策のみ紹介しました。
外部からの攻撃以外にも実装のミスによりアプリケーションが意図しない動きをし、情報漏洩につながるパターンもあります。
思わぬところでセキュリティ問題が発生することもあるため、Webアプリケーションを開発するにあたっては、常に最新の情報を身につけることが必要です。