はじめに

こんにちは。ちょーさんです。
今日、新しいWebアプリケーションがどんどん生み出されています。
しかし、同時に個人情報の漏洩やハッキング等、セキュリティ事件/事故が多発しており、
セキュリティ対策は必須と言えるでしょう。
本記事ではWebアプリケーション開発初心者向けに対策しなければならない点をまとめます。

Webアプリケーションのセキュリティ団体として、OWASPがあります。
Open Web Application Security Project(国際ウェブセキュリティ標準機構)の略で、
アメリカの非営利団体です。日本にも活動拠点があります。
OWASPでは、最も重大なWebアプリケーションリスク OWASP Top 10が公開されています。

OWASP Top 10

以下がOWASPで纏められているセキュリティリスクです。
2013年からより脅威性が増したものや、削除されたものもあるようです。

インジェクション

データベースへ不正なクエリを流し、データが盗まれたり認証を不正に成功させたりと、
重大な被害をもたらします。最も有名で大変危険なセキュリティリスクになります。
まずは以下クエリを例に本リスクを説明してきます。

sql = "SELECT * FROM memberTbl WHERE id = '$id' AND pass = '$pass' ";
result = query($sql);

ログイン画面でユーザID($id)とパスワード($pass)を取得して、
上記のようなクエリでログイン認証させる場合、
パスワードの文字列次第でログインできてしまう可能性があります。
パスワード欄に以下のような文字列が入った場合にログインできます。

id :user01
pass : ' OR '1' = '1

上記入力情報により、クエリは以下になります。
クエリは1=1により、必ず成り立ち、パスワード無しでuser01の結果を取得できます。

SELECT * FROM memberTbl WHERE id = 'user01' AND pass = '' OR '1' = '1'

対策1

プレースホルダという仕組みを使って回避します。
PHPの場合は以下のように書き換えます。

$sql = "SELECT * FROM memberTbl WHERE id = ? AND pass = ?";
$ps = prepare($sql);
$ps -> bindValue('user01', $id, PDO::PARAM_STR);
$ps -> execute();

上記のように書き換えると、「?」に置き換えた箇所は文字列として捉え、
SQLの文法構文(OR等)は無効となります。

対策2

そもそも入力欄の情報をそのまま使用せず、SQLを組み立てる回避策もあります。
入力情報をDBへアクセスするクエリまでの間に加工し、クエリを実行すれば、
このような問題は避けることもできます。
とはいえ、ユーザID等は加工しようがないので、プレフィックスをつけるなり、
ユーザIDのフォーマットを正規表現で定義しておく等、対策する必要があります。

対策3

WAF(Web Application Firewall)を導入します。
悪意あるクエリを自動判定し、
そもそもWebサーバに到達する前にリクエストを拒否させることができます。
AWSでインフラ構築をする場合、以下のようなマネージドなサービスも使用することができます。
AWS WAF
いやー便利な世の中です。

まとめ

最も有名なセキュリティリスク、インジェクションについて紹介しました。
本記事に記載されていることが対策のヒントになれば幸いです。
Web初心者だからセキュリティ対策は簡単で良いよね?は許されません。
たった一度のセキュリティ事件/事故で全てを失う可能性もあります。
安心、安全なWebセキュリティの知識を身につけましょう。

次回予告

次回はOWASPの第2位の項目、認証の不備についてまとめます。

関連社内ページ

難しくない!誰でもわかる情報セキュリティ概要