「苦労して作ったWebアプリ、やっと動いた!さあリリースだ!」
エンジニアにとって、自分のコードでサービスが動く瞬間の喜びは格別ですよね。
しかし、ちょっと待ってください。そのアプリ、セキュリティ対策されてますか?
機能を作ることに精一杯で、セキュリティ対策が後回しになっているケースはしばしばあります。脆弱性を放置したまま公開することは、ユーザーの情報を危険に晒すだけでなく、エンジニアとしての信頼を失うことにも繋がります。
そこで今回は、セキュリティの知識に自信がない開発者に向けて、最低限チェックしておくべき「脆弱性対策」をまとめました!
初学者でも今日から実践できる基本的なポイントを解説します。
そもそも「脆弱性」とは?
Webアプリケーションにおけるプログラムの不備や設計ミスのことです。ここを悪用されると、攻撃者にシステムを乗っ取られたり、情報を盗まれたりします。
世界標準のセキュリティ基準としてOWASP Top 10というものがありますが、今回はその中でも特に初心者がやってしまいがちな「三大脆弱性」+α に絞って解説します。
1. SQLインジェクション
お問い合わせフォームのような、入力・送信できるページから悪意のあるSQL文(データベースへの命令)を混ぜ込むことで、本来見せてはいけないデータを表示させたり、データを消去したりする攻撃です。
アプリケーションが入力値を適切にエスケープしないままSQL中に展開することで発生します。
例えば次のようなSQL文があるとします。
SELECT * FROM users WHERE name = '(入力値)';ここで入力値に例えば "t' OR 't' = 't" という文字列を与え送信されると、SQL文は次のように受け取り展開されます。
SELECT * FROM users WHERE name = 't' OR 't' = 't';このSQL文の意味は「もしnameがtなら、もしくはtがtならユーザー情報をすべて取得する」というものです。
「もしtがtなら...」これだけ聞くと一見意味がわからないかもしれませんが、t=tって、当たり前のことを言ってますよね。
つまり、この文は条件が常に真となり、 SELECT * FROM users (ユーザー情報をすべて取得する)が実行されてしまいます。
【解決策:Laravel】(Eloquent/クエリビルダ)を使う
Laravelなどのフレームワークを使っている場合、直接SQLを文字列結合などで書くのではなく、Eloquent ORMで記述すれば自動的にプリペアドステートメント(※)という仕組みによって対策されます。
※プリペアドステートメントとは、SQL文の構造(テンプレート)と値を分離してデータベースに送り、後から値を埋め込むことで、SQLインジェクション対策と処理速度向上を実現する仕組み
$user = User::where('id', $request->input('id'))->first();対策ポイント:
- SQL文を文字列結合で作らない。
- フレームワークのORM(Eloquentなど)や、プリペアドステートメントを使用する。




