こんにちは、じゃすてぃです。
昨日はなぜWebアプリケーションのセキュリティ対策が必要なのかについて簡単に解説しました。
今回は、Webエンジニアが絶対に抑えておくべきセキュリティ対策の実施例として、脆弱性を狙った代表的な攻撃方法と、それに対抗する方法として3つのセキュリティ対策を紹介します。
目次
セキュリティーホールとなりうる脆弱性を狙った攻撃
なぜWebアプリケーションのセキュリティ対策が必要なのかでも解説しましたが、クラッカーと呼ばれる攻撃者は常日頃世界中のWebサイトの脆弱性を半自動的に(プログラムを組んで)探しています。
まずはセキュリティ対策を施す上で、脆弱性を狙った攻撃がどういうものなのかを知る必要があります。
まずは脆弱性を狙った攻撃方法について以下で紹介します。
脆弱性を狙った攻撃方法①:SQLインジェクション
世の中の多くのWebアプリケーションは、ユーザーが入力したデータをサーバー側で処理し、MySQLなどのデータベースに保存します。
それらのデータベースはSQL言語を使ってデータの書き込みや読み取りを行います。
サーバーが受け取ったデータの中にSQL言語が注入されている(=SQLインジェクション)と、SQLが実行されたり予期せぬ動作を引き起こす原因となるのです。
例えばお問い合わせフォームがあるとします。
そのフォームの本文などに、「このサイトの会員情報を取得する」といった指示をSQL言語で書き込むことで、対策をしていないサイトであれば会員情報が盗まれてしまう危険があるのです。
- SQLインジェクションとは
- WebアプリケーションのサーバーにSQL言語を送信する攻撃
- SQL言語で個人情報などを出力する
脆弱性を狙った攻撃方法②:XSS(クロスサイトスクリプティング)
XSS(クロスサイトスクリプティング)は、Webページを操作してターゲットのWebアプリケーションに意図せぬ動作をさせる攻撃方法です。
SQLインジェクションと異なる点は、SQLインジェクションはターゲットのWebアプリケーションのデータベースを操作しますが、XSS(クロスサイトスクリプティング)はターゲットのWebアプリケーションのWebページを操作します。
簡単に言うと、Webページの表示や動きを書き換えてしまうのです。
通常Webアプリケーションの表示や動作を変更するためには、サーバーにログインしてファイルを更新することが必要になります。
ですが、XSS(クロスサイトスクリプティング)による攻撃が成功してしまうと、サーバーにログインすることなくWebアプリケーションの表示や動作を勝手に書き換えてしまえるのです。
よくある悪用方法としては、XSS(クロスサイトスクリプティング)によってターゲットのサイトのリンクをすべてアダルトサイトに飛ばすように変更をしたり、詐欺サイトに誘導するようにしたりするケースがあります。
また、個人情報の入力を求めるフォームなどの勝手に表示させ、大量の個人情報を入手したという事例も過去に報告されています。
突然普段利用しているサイトで【会員情報の確認のため、IDとパスワードを再度入力してください】と言われたら、疑わずに入力してしまう人が多いでしょう。
加えて、ログイン情報を扱うCookieも取得することができてしまうので、他者になりすましてサイトにログインすることが可能になってしまい大変危険な攻撃です。
- XSS(クロスサイトスクリプティング)とは
- Webアプリケーションにプログラムを送信する攻撃
- サーバーにログインすることなくWebサイトの表示や動作を書き換えてしまう
脆弱性を狙った攻撃方法③:ブルートフォースアタック(総当たり攻撃)
こちらは力技ですが、ブルートフォースアタック、いわゆる総当たり攻撃では、ログイン時に求められるパスワードを大量にプログラムで自動生成し、正しいパスワードが見つかるまでひとつずつ試していくという攻撃方法になります。
例えば覚えやすく簡単な組み合わせのパスワードであれば、プログラムを回して文字列を総当たりで試すことであっという間にログインされてしまう可能性があります。
なんと、4桁程度のパスワードであれば数分、6桁でも数日でパスワードが解析されてしまうのだとか。
ただし、10桁のパスワードであれば現在であれば解読まで最大数年かかるとのことなので、10桁以上のパスワードを使用するようにしたいところ。
- ブルートフォースアタックとは
- プログラムを使ってパスワードなどのログイン情報を生産し、すべてを総当たりで試す攻撃
- 4桁程度のパスワードであれば最大数分で解読されてしまう
脆弱性を狙った攻撃に対するセキュリティ対策
ここまでは、脆弱性を狙った攻撃の主要な方法を3つ紹介しました。
ここからは、それらの攻撃に対して気をつけたいセキュリティ対策方法を紹介します。
セキュリティ対策手法①:SQLインジェクションに対する対策
SQLインジェクションは、サーバーに送信されたSQL言語をデータベースが命令文と認識してしまうことが問題でした。
そのため、サーバーに送信される文字列を、SQL言語として認識できないようにしてあげることが必要です。
その方法を「エスケープ処理」といいます。
「エスケープ処理」では、送信された文字列の中で、SQL分で特別な意味を持つ記号や文字列を別の文字に置き換えたり、削除したりする処理を行うのです。
ユーザーから送信されるデータを受け取る処理をする際には、SQL言語として認識できない形に文字列を変換してあげる、という「エスケープ処理」を必ずするようにしましょう。
セキュリティ対策手法②:XSS(クロスサイトスクリプティング)に対する対策
XSS(クロスサイトスクリプティング)では、主にHTMLやJavaScriptを使ってコードを実行させてWebサイトを勝手に書き換えてしまいます。
そのため、送信されたJavaScriptを実行させないようにする必要があります。
先程説明したSQLインジェクションへの対策と同様、送信されたデータに対して、HTMLやJavaScriptが動作しないように「エスケープ処理」をしてあげます。
具体的には <
や >
といった括弧、&
や"
といったHTML特殊文字(HTML言語のコードとして認識されるもの)をすべて変換してあげる必要があります。
JavaScriptに対してもエスケープ処理をしてあげましょう。
Ruby,PHPなど、各プログラミング言語ごとにエスケープ処理を行う方法があるので活用してください。
セキュリティ対策手法③:ブルートフォースアタック(総当たりで攻撃)に対する対策
総当たりでパスワードを特定する、最も原始的でかつ最も確実な攻撃であるブルートフォースアタック。
特別な技術がなくても、ただ単に総当たりでパスワードを試していくだけなので、比較的日常的に使われている攻撃手法です。
これをプログラムで確実にストップする手立てはないため、Webエンジニアとしては、自分のサービスにユーザーが登録する際に、パスワードの安全性を高めてあげることが必要です。
先程も述べたように、4桁のパスワードであればものの数分、6桁でも最大数日でパスワードが解読されてしまいます。
そのため、なるべくパスワードの桁数を多くしてもらうよう必要があります。
また、単純な数字のみのパスワードではなく、英字や記号も使ってもらうようにすることで、ブルートフォースアタックでのパスワード解析が現実的に困難な堅牢なパスワードが出来上がります。
開発者としてできることは、パスワード登録のときにバリデーションをかけ、桁数のチェックや、記号や英字を使っているかのチェックをかけることで、手間はかかりますが堅牢なパスワードを入力してもらえるようになります。
- 堅牢なパスワードを使ってもらうために
- 最低8桁でないと登録できないようにするなど、桁数を多くする
- 数字だけでなく英字も使ってもらう
- 半角英字だけでなく、全角英字も使ってもらう
- 記号も使ってもらう
セキュリティ対策まとめ
いかがでしたか?
今回は、Webエンジニアが知っておくべき脆弱性を狙った主要攻撃方法と最低限のセキュリティ対策3つを図を使いながら説明しました。
- 絶対にやっておくべきセキュリティ対策
- ユーザーからのデータを受け取るときは、必ずエスケープ処理をする
- 堅牢なパスワードを設定してもらうためにバリデーションをかける
これらのセキュリティ対策は、必須です。
最低限のセキュリティ対策です。
しかし、これらを実施しているだけで安全性はぐっと高まります。
ユーザーの情報を守るためにも、自分や自社を守るためにも、Web開発に携わる際は、これらの対策を抜かりなく行うようにしましょう。