アップリーチでは、企業の集客・業務効率化を支援するアプリ開発を行っています。
登録者数30万人を突破(2021年7月時点)した自社アプリ開発のノウハウを活かし、御社の事業をトータルサポート。「使いやすく整理整頓されたアプリ」を作るために、設計の段階からデザイナーが参画し、デザイン性を重視。iOS、Android、Webシステムなど、御社のビジネスにフィットしたアプリ開発をワンストップで対応いたします。
下記ボタンより、お気軽にご相談ください。
はじめに
こんにちは。ちょーさんです。
今日、新しい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位の項目、認証の不備についてまとめます。