『安全なWebアプリケーションの作り方』に学ぶ、セキュリティの重要性|東京のWEB制作会社・ホームページ制作会社|株式会社GIG

『安全なWebアプリケーションの作り方』に学ぶ、セキュリティの重要性

2021-12-14 制作・開発

1. セキュリティの重要性について

こんにちは、GIGでバックエンドエンジニアを仰せつかっている庄子です。GIG社内ではセキュリティについての関心が高まってきており、積極的に輪読会や勉強会が開かれるようになっています。

セキュリティインシデントが多く発生する昨今、セキュリティの重要性が一般的にも認知されるようになってきたと思います。実際に、2014年には脆弱性に対するセキュリティを怠ってクレジットカード情報を漏洩させたシステム開発企業に損害賠償金を支払うよう命じる判例も出ています。

(参考: https://blog.tokumaru.org/2015/01/sql.html

つまり、セキュリティをしっかりしていないシステムを作ること自体が、起訴されるリスクを孕んでいるということです。この記事を通して、Webアプリケーションにおける「セキュリティの重要性」について共有できればと思います。


2. Webアプリケーションの脆弱性について

2.1 脆弱性とは

脆弱性とは、悪用できる不具合や設計ミスのことです。開発したWebアプリケーションにセキュリティ上の欠陥や不具合がある場合、攻撃者が悪用しさまざまなリスクが生じます。そのため、Webアプリケーションの開発を行う上で、脆弱性が発生しないような対策が必要です。

2.2 脆弱性によるリスク

脆弱性があることによって、発生するリスクはさまざまです。以下はその一例です。

2.2.1 盗聴リスク

脆弱性があることにより、内部ネットワークに入ることなく内部のデータを盗聴できる場合があります。

また、本来は外部のデータベースに保存すべきであるクレジットカード番号等の機密情報を平文で保存している場合は、利用ユーザーが経済的な損失を被る場合があります。

また、盗聴されたことにより、社会的信用を大きく損なうことになります。

2.2.2 改ざんリスク

脆弱性があることにより、Webサイトのデータが改ざんされる危険性があります。

ユーザーの意図しないリクエスト、処理が起きることで、ユーザーのデータが書き換えられる可能性があります。

例えばSNS等で投稿が改ざんされた場合、間違った情報を流布することもありますし、最悪の場合殺害予告等の犯罪として誤認逮捕されるケースになるリスクもあります。


3. 主な攻撃手法と対策方法

Webアプリケーションの脆弱性は入力に起因するものはなく、処理に起因するものと出力に起因するものがあります。出力に起因する脆弱性は「インジェクション」という名前がつくことが一般的です。これから紹介する攻撃手法に関してはほんの一例なので、気になる方は調べてみてください。

3.1 SQLインジェクション

SQLインジェクションは、SQLを呼び出すときに呼び出し方に不備がある場合に使用される攻撃手法です。情報漏洩、データの改ざんなどさまざまな範囲に影響があります。

SQLインジェクションは、データベースを使用しているWebアプリケーションで発生します。そのため、対策としては、SQLの呼び出し時に静的プレースホルダを利用することが挙げられます。個人情報等の重要情報を持っているWebアプリケーションは、とくに注意が必要です。

参考までに、PDO(PHP Data Objects)を使用したプレースホルダは以下のように書くことができます。

$pdo = new PDO('mysql:dbname=test;host=localhost', $userName, $password);
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email and pass = :pass;');


$stmt->bindValue(':email', $email); -- プレースホルダに値を入れる
$stmt->bindValue(':pass', $pass); -- プレースホルダに値を入れる
$stmt->execute(); -- sqlを実行

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

クロスサイトスクリプティング(XSS)は、Webアプリケーションが、入力により動的にHTMLを生成するときに処理に不備があると、任意の処理がされてしまう攻撃手法です。Webアプリケーションは、外部からの入力を動的に表示するときに対策を施しますが、そのうち一箇所でも抜け漏れがある場合は、XSSの被害を受ける可能性があります。

XSSの対策としては、属性値を「"」 (ダブルクォート)で囲むということ、HTMLで特別な意味を持つ記号文字をエスケープ処理することが挙げられます。またPHPでエスケープを行うときはhtmlspecialcharsを使うことも一般的です。独自でエスケープ関数を作ることもできますが、抜け漏れが発生する可能性があるので、基本的には言語にある標準関数を使うことをおすすめします。

(参考: https://www.php.net/manual/ja/function.htmlspecialchars.php

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

決済機能等のWebアプリケーションで重要な処理を行うときは、本当に正しいユーザーかどうかを確認してから処理を実行することが求められます。ですが、この確認処理が抜けている場合、第三者が重要な処理を実行できてしまいます。このような問題を「クロスサイトリクエストフォージェリ(CSRF)」と言います。

対策としては、正しいユーザーからのリクエストかどうかを確認することです。CSRFの場合は、上記のXSSと違い、リクエストを送れば攻撃が成立してしまいます。

そのため、CSRFの具体的な対策として、ワンタイムトークンを使用する方法があります。

トークンとは、第三者が知ることができない、ユーザーを認証する意味のない文字列を指します。そのトークンを発行し、サーバーと認証することで重要な処理を行うときに本人だと認証することができます。


4. GIGでの対策とセキュリティに関する学習

上記のとおり、さまざまな攻撃手法があるWebアプリケーションの脆弱性ですが、Webアプリケーションを開発する身としては、これらの攻撃手法に対して対策を取らないといけません。

そこで、『体系的に学ぶ 安全なWebアプリケーションの作り方 第2版』を参考に、GIGでは以下のような対策を行っています。

  1. 脆弱性をチェックするOWASP ZAPを導入し、実際にセキュリティチェックリストを作成して、脆弱性のチェックをしていくことを進めています。
  2. クライアントのセキュリティ要件に合わせてログインパスワードの文字数設定や予見変更、ログインセッションの維持時間を最低限に設定、アカウントロック機能の設定などを行っています。

個人的にもよりセキュリティへの関心が高まり、勉強していかないと思い、『ウェブ・セキュリティ基礎試験』という資格があることを知りました。

この資格は『体系的に学ぶ 安全なWebアプリケーションの作り方 第2版』を出題範囲とした資格となっており、その名のとおり、体系的に安全なWebアプリケーションの作り方を学べる本となっています。

先日このウェブ・セキュリティ基礎試験を受験しました。出題傾向はいろいろな受験ログから把握はしていたのですが、問題の聞かれ方が変わると違う問題にように感じることも多かったです。結果は700点合格で800点を取り、合格しました!

ウェブ・セキュリティ基礎試験は、体系的にWebアプリケーションのセキュリティを知ることができるので、セキュリティの勉強したいけど何から始めたらよいかわからないという方は、資格を取ってみるのも一つの選択肢としてありだなと思います。

個人タスクで、セキュアなWebアプリケーションを作成できることになるのはもちろん、脆弱性診断のナレッジや攻撃手法のパターンなどをプロジェクトやチームに共有することでより安全なWebアプリケーションを作成できると思います。


5. 参考文献

情報処理推進機構. "安全なウェブサイトの作り方". 情報処理推進機構. 日本語版(2021年3月31日改訂第7版第4刷公開)

https://www.ipa.go.jp/security/vuln/websecurity.html , (参照: 2021-10-02)

徳丸浩. "安全なWebアプリケーションの作り方 第2版". 徳丸浩. https://wasbook.org/ (参照: 2021-10-02)

WebやDXで困っている方、お気軽にご相談ください

庄子肇

バックエンドエンジニア。宮城大学事業構想学部デザイン情報学科を卒業後、ベンチャー企業でエンジニアとして常駐先のシステム開発やサイト制作の経験を積んだ後、2019年10月にGIGにジョイン。