セキュリティ・ID

アプリケーションセキュリティ入門|世界ランキング1位の脆弱性は、今日あなたが書いたコードにある

個人開発のアプリは実際、何をやられるのかOWASP Top 10とは何で、どう使うのか限られた時間で、どの対策から手を付けるべきか

自分のアプリのURLをよく見てください。/orders/1024——この数字を1023に変えたら、他人の注文が見えませんか?もし見えるなら、あなたのアプリには世界ランキング1位の脆弱性があります。高度な攻撃ではありません。URLの数字を変えるだけです。

このランキングはOWASP Top 10という、Webセキュリティの世界標準の統計です。2025年版の1位は「アクセス制御の不備」——つまり個人開発者が一番やりがちなミスが、世界で一番多い脆弱性だということです。この記事はこのTop 10を地図に、限られた時間でどこから直すべきかを整理します。

この記事の要点

  • OWASP Top 10はWebセキュリティの世界標準の意識合わせ文書。2025年版が最新
  • 1位はアクセス制御の不備——「ログインしているか」だけ確認して「その人のものか」を確認しない実装
  • 対策の第一歩はコード1行——データ取得の条件に必ずuserIdを入れる
  • XSS・SQLインジェクションはフレームワークの作法に従えばほぼ防げる。作法を外れた1行が穴になる

OWASP Top 10という地図——2025年版で何が1位か

Top 10は「順番に全部やる」リストではなく、優先順位の地図。1位のアクセス制御から着手すれば、投資対効果が最大になる。

アプリケーションセキュリティの世界標準の出発点がOWASP Top 10です。公式の定義は“a standard awareness document for developers and web application security”——開発者のための、意識合わせの標準文書。実際の侵害データと専門家の合意から、最も危険な脆弱性カテゴリを10個並べています。

2025年版の顔ぶれ

順位カテゴリ個人開発での典型例
A01アクセス制御の不備URLのIDを変えると他人のデータが見える
A02セキュリティ設定ミスデバッグモードのまま公開・管理画面が全開
A03ソフトウェアサプライチェーンの不備脆弱な依存パッケージを放置
A04暗号化の失敗パスワードを平文・弱いハッシュで保存
A05インジェクションSQL文字列連結・HTML直接出力(XSS)
A06〜A10設計不備・認証不備・完全性・ログ不備・例外処理通知ゼロ運用・エラー画面に内部情報
表1 ── OWASP Top 10:2025(公式サイトより。個人開発への当てはめは編集部)

1位の正体——「ログイン確認」と「所有確認」は別物

1位のアクセス制御の不備(Broken Access Control)の典型が、認可の確認漏れです。「ログインしているか」は確認しても、「そのデータがその人のものか」を確認していない——コードで書くとこの差は1行です。

orders.js(1行の差が世界1位の脆弱性になる)javascript
// ❌ ログイン確認だけ: 誰でも他人の注文をIDで取れる(IDOR)
const order = await db.order.findUnique({
  where: { id: orderId },
});

// ✅ 所有確認つき: 自分の注文しか取れない
const order = await db.order.findFirst({
  where: { id: orderId, userId: req.user.id },
});

この形の脆弱性はIDOR(Insecure Direct Object Reference)と呼ばれます。対策は難しくありません——データを取るクエリすべてに、所有者の条件を機械的に入れる。難しいのは技術ではなく、全部のクエリで徹底する規律の方です。

The OWASP Top 10 is a standard awareness document for developers and web application security.
出典OWASP Top 10:2025(公式サイト) 一次情報を確認2026-08-14 この内容の有効期限2027-02-14

個人開発が実際に落ちる穴——編集部が自分たちのコードで踏んだもの

穴は「知らない技術」ではなく「知っているのに全箇所で徹底できていない基本」に開く。チェックリスト化して機械的に回すのが唯一の対策。

アプリケーションセキュリティの記事は他人事の脅威話になりがちなので、編集部自身の実例を出します。当メディアの運営元はマーケットプレイス(ServiceDock)を開発しており、自分たちのコードレビューで実際にこの種の穴を見つけて直してきました

実際にあった3つの穴

  • IDORそのもの ── 注文取得のクエリが id だけで引いており、userId の条件が抜けていた。修正は1行、見つけるまでが仕事
  • エラーの内部情報漏れ ── 例外の error.message をそのままAPIレスポンスで返していた。DB構造やファイルパスが攻撃者へのヒントになる
  • 更新系の競合 ── 「残数を読む→確認→減らす」が別々の処理で、同時アクセスで枠を超えて使える状態だった。トランザクションで原子化して修正

対策はリスト化して「新しい画面を作るたび」に回す

この経験から学んだのは、セキュリティは知識ではなく運用だということです。編集部では新しいAPIを作るたびに固定のチェックリスト(認証→所有確認→入力上限→エラー整形→レート制限)を回しています。1回作れば数分で回せて、穴の大半はこの数分で防げます。

余談 「うちは狙われない」が成立しない理由

攻撃の入口の大半は、人間ではなくスキャナーです。公開されたWebアプリは知名度と関係なく、既知パターンの自動試行を受け続けます。OWASPの1位が示すのは「攻撃が高度化した」ではなく、基本の徹底漏れが世界中で最も多いという事実——個人開発者にとってはむしろ朗報で、高度な防御より先にやるべきことが明確だということです。

Broken Access Control
出典OWASP Top 10:2025・編集部のマーケットプレイス開発での実例 一次情報を確認2026-08-14 この内容の有効期限2027-02-14

今週末にやる順番——3時間のセキュリティ改善プラン

全部やろうとして何もやらないのが最悪。アクセス制御→認証→注入系の順に、手を動かす範囲を絞る。

アプリケーションセキュリティの学習は範囲が広く、完璧を目指すと着手できません。個人開発の現実に合わせて、効果の大きい順に3ステップへ絞ります。

ステップ1(1時間): 自分のアプリを攻撃してみる

開発環境で、別ユーザーのアカウントを2つ作り、片方でログインしたままURLのID・APIのパラメータをもう片方のものに変えて叩きます。見えてしまったらそれがIDORで、該当クエリに所有者条件を足します。データ取得系のエンドポイントを上から順に、機械的に。

ステップ2(1時間): 認証まわりの既定値を確認する

  • パスワードはbcrypt/argon2等でハッシュしているか(平文・MD5は即修正)
  • セッション・トークンの有効期限があるか。ログアウトで無効化されるか
  • ログイン試行にレート制限があるか(総当たり対策)

ステップ3(1時間): 注入系の「作法外れ」を探す

SQL文字列の連結・HTMLへの変数直接埋め込みを grep で探します。ORMのパラメータ化・テンプレートの自動エスケープというフレームワークの標準の書き方に戻すだけで、インジェクション系はほぼ塞がります。認証・認可のより深い設計はAPI連携の記事の最小権限の考え方と、Webhook受信の署名検証もあわせて確認してください。

この節は一次情報での裏取りが未了です。 編集部の整理(OWASP Top 10の優先順位づけ)(2026-08-14 記載)

よくある質問

個人開発の小さなアプリでも狙われますか?
狙われます。攻撃の大半は人間ではなくボットによる無差別スキャンで、アプリの知名度は関係ありません。公開した瞬間から、既知の脆弱性パターンの自動試行が始まると考えてください。
OWASP Top 10を全部対策しないとダメですか?
順番が大事です。まず1位のアクセス制御(自分のデータしか見えないか)、次に認証(パスワード・セッションの扱い)、その次に注入系(SQLインジェクション・XSS)。この3つでリスクの大半をカバーできます。
フレームワークを使っていれば安全ですか?
半分は正しいです。SQLインジェクションやXSSは、ORMやテンプレートエンジンの標準の書き方に従っていればほぼ防げます。ただしアクセス制御と認可の設計は、フレームワークは肩代わりしません。そこが自分で書く部分です。
脆弱性診断ツールを入れれば見つかりますか?
注入系や設定ミスはツールで見つかりやすい一方、アクセス制御の不備は「誰が何を見てよいか」という仕様の問題なので、ツールでは見つけにくい代表格です。自分のアプリのURLでIDを変えてみる手動テストが、最初の診断として有効です。

まとめ

  • 世界1位の脆弱性はアクセス制御の不備。高度な攻撃ではなくURLのID書き換えで抜かれる
  • 対策の順番はアクセス制御→認証→注入系。この3つで大半をカバーできる
  • 注入系はフレームワークの作法が守る。生SQL・生HTMLを書いた1行が穴になる
  • 「誰が何を見てよいか」は仕様の問題。ツールでは見つからないので自分でテストする

今日から始められること

  1. 自分のアプリで、URLのIDを他人のものに変えて叩いてみる(本番ではなく開発環境で)
  2. データ取得のクエリ全部に「所有者の条件」が入っているかgrepで確認する
  3. 生SQLの文字列連結・HTMLの直接出力をしている箇所を探して、標準の書き方に直す
  4. OWASP Top 10の2025年版に目を通し、自分のアプリに該当する項目に印を付ける

実務で組んだアプリケーションセキュリティのワークフローには、値段が付きます

同じ課題を持つ会社にとって、動いている設定は「作る時間」を買えるということです。ServiceDockは自作のワークフローやテンプレートを出品できるマーケットプレイスです。手数料や出品の流れは出品者向けページにまとまっています。

出品の仕組みを見る