セキュリティ・ID

セキュアコーディングとは|1位は「危険な関数を避ける」ではなくアクセス制御

セキュアコーディングは何から手を付ければいいのか入力値の検証より優先すべきものはあるのかOWASP Top 10とProactive Controlsはどう使い分けるのか

ログイン機能を実装し終えて、次はセキュリティ対策だと考える。SQLインジェクション対策、XSS対策、パスワードのハッシュ化——検索して出てくる項目を上から潰していく。その順番では、いちばん大きな穴が最後まで残ります

OWASPが開発者向けにまとめた実装指針「Proactive Controls」の2024年版で、1位は「アクセス制御を実装せよ」でした。2018年版では7位だった項目です。この記事では順序が入れ替わった意味を追い、実際にコードを動かして、認可の有無が何を分けるのかを本物の出力で示します。

この記事の要点

  • セキュアコーディングの1位はアクセス制御の実装。2018年版の7位から繰り上がった
  • 攻撃側の分類でも1位はBroken Access Control。両方が同じ場所を指している
  • 認証(誰か)と認可(何をしてよいか)は別物。認証だけ実装した状態が最も危険
  • 実装の型は取得条件に所有者を含めること。IDだけで引かない

着手順が変わった|アクセス制御が7位から1位へ

2024年版の1位はアクセス制御。2018年版では7位だった。攻撃の分類と開発の指針が、別々の経路で同じ結論に到達している。

セキュアコーディングの指針として OWASP が開発者向けにまとめているのが Proactive Controls です。公式は位置づけをこう定義しています。“a catalog of better practices, a set of items developers can embrace and implement in their code bases”。実装するものの目録であって、攻撃の一覧ではありません。

この目録の並び順が、2018年版と2024年版で大きく変わりました。アクセス制御が7位から1位へ繰り上がっています。逆に2018年版で1位だった「セキュリティ要件の定義」は、2024年版では4位に相当する位置へ移りました。

2024年版の10項目——3つが新設され、2つが姿を消した

2024年版内容2018年版での対応
C1アクセス制御の実装C7(7位)
C2データ保護のための暗号利用C8(8位)
C3全入力の検証と例外処理C5・C10(5位・10位)
C4最初からセキュリティを考えるC1(1位)
C5既定値を安全にする該当なし(新設)
C6依存コンポーネントを安全に保つC2(2位)
C7デジタルIDの保護C6(6位)
C8ブラウザのセキュリティ機能の活用該当なし(新設)
C9セキュリティログと監視の実装C9(9位)
C10SSRFを止める該当なし(新設)
表1 ── OWASP Top 10 Proactive Controls 2024 の全10項目と、2018年版での位置(出典: top10proactive.owasp.org、2026-08-16取得)

攻撃の分類と開発の指針が、同じ場所で一致した

OWASP には性格の違う2つの一覧があります。攻撃側の分類が Top 10、開発側の指針が Proactive Controls です。2024〜2025年版では、両方の1位がアクセス制御になりました

OWASP Top 10:2025Proactive Controls 2024
視点攻撃側(何が起きているか)開発側(何を実装するか)
1位A01 Broken Access ControlC1 アクセス制御の実装
使いどころ現状把握・分類着手順の決定
データの出所約17.5万件のCVE+コミュニティ調査実務者による実装指針
表2 ── 2つの一覧の性格と使い分け(出典: owasp.org / top10proactive.owasp.org、2026-08-16取得)

順位の意味を詳しく知りたい場合はOWASP Top 10の解説記事を参照してください。あちらは「順位が出現率ではない」ことを扱っています。

余談 「危険な関数を避ける」はもう主役ではない

セキュアコーディングと聞いて最初に浮かぶのは、SQLを文字列連結しないことやエスケープ処理でしょう。これらは2024年版では C3 に集約され、単独の最優先事項ではなくなりました。入力を完璧に検証しても、他人のデータを返す設計であれば何も防げない——順序の変更はそう読めると編集部は考えています。

Proactive controls are a catalog of better practices, a set of items developers can embrace and implement in their code bases to avoid many common security issues. Proactive controls provide positive patterns to implement solutions considered secure by design.
出典OWASP Top 10 Proactive Controls 2024「Introduction」 一次情報を確認2026-08-16 この内容の有効期限2027-02-16

C1の実装|取得条件に所有者を入れる、それだけ

認可の実装は難しい理屈ではなく、クエリの条件を1つ増やすこと。IDだけで引くのをやめれば、他人のデータを返す経路が閉じる。

セキュアコーディングでアクセス制御が抜ける典型は、認証を実装し終えた直後です。ログインは通っている、セッションも有効——だからデータを返してよい、と書いてしまいます。認証(誰か)と認可(何をしてよいか)は別の判定です。

実際に動かす|条件を1つ足すと何が変わるか

違いを文章で説明するより、動かした方が早いので実行しました。請求書を2件持つデータに対し、user_A がログインした状態で user_B の請求書IDを指定します。

javascript
const invoices = [
  { id: 'inv_1001', ownerId: 'user_A', amount: 12000, memo: 'Aさんの請求書' },
  { id: 'inv_1002', ownerId: 'user_B', amount: 98000, memo: 'Bさんの請求書' },
];

// 認可なし: IDが一致すれば誰にでも返す
function findInvoiceUnsafe(invoiceId) {
  return invoices.find((v) => v.id === invoiceId) ?? null;
}

// 認可あり: IDと所有者の両方が一致したときだけ返す
function findInvoiceSafe(invoiceId, requesterId) {
  return invoices.find((v) => v.id === invoiceId && v.ownerId === requesterId) ?? null;
}

// user_A がログイン中。他人(user_B)の請求書IDを指定して叩く
const attacker = 'user_A';
const target = 'inv_1002';
text
--- 認可チェックなし ---
返却: Bさんの請求書 / 98000円
--- 認可チェックあり ---
返却: null(403にする)
--- 本人が自分のものを取得 ---
返却: Aさんの請求書 / 12000円

差分は && v.ownerId === requesterId の一節だけです。これが無いと 98,000円という他人の金額がそのまま返ります。あるとnullになり、本人の取得は通常どおり成功します。

ORMでも同じ|findUnique ではなく所有者つきで引く

実際のアプリではORMを使いますが、原理は変わりません。主キーだけで引く関数(Prismaなら findUnique({ where: { id } }))は、所有者の条件を書く場所がありません。所有者を条件に含められる関数へ置き換えます。

  1. データ取得箇所を全件洗い出す。IDをURLやリクエストボディから受け取っている処理が対象
  2. 取得条件に所有者を足すwhere: { id, userId: 現在のユーザー } の形にする
  3. 更新・削除も同じ扱いにする。読み取りだけ直して更新系が残ると意味がない
  4. 管理者専用の操作には役割の確認を入れる。所有者条件では管理者を表現できない
取得後に判定するのでは遅い場合がある「IDで引いてから所有者を比較する」書き方でも結果は同じに見えますが、比較を忘れた1箇所がそのまま漏洩になります。取得条件そのものに所有者を含めておけば、書き忘れたときにデータが返らないだけで済みます。失敗したときに安全側へ倒れる書き方を選んでください。
この節は一次情報での裏取りが未了です。 OWASP Top 10 Proactive Controls 2024「C1: Implement Access Control」(2026-08-16 記載)

書いたあとの確認|他人のIDを入れて叩くだけ

認可の検証に道具は要らない。自分のアカウントで他人のIDを指定し、データが返らないことを確かめる。返ったら穴がある。

セキュアコーディングが事後対応を避けるための営みであることは、公式の説明に表れています。“prevent common vulnerabilities during an application's inception”。作り始めの段階で防ぐ、という発想です。ただし書いた後の確認は必要で、認可については特別な道具が要りません。

実装済みと言える条件——設計3つと、実行1つ

認可が実装済みと言えるのは4条件すべてを満たしたとき。読み取りだけ直して更新系が残る例が最も多い。

充足 3 / 4取得条件に所有者が入っているIDだけで引く箇所が残っていれば他人のデータが返る更新・削除も同じ条件で守られている読み取りだけ直すと書き換えの経路が残る管理者操作に役割の確認がある所有者条件では管理者の権限を表現できない他人のIDで叩いて確認したコードを読むだけでは通っている経路を見落とす4つ目は実行による確認。前3つが設計上そろっていても、実際に叩くまでは経路の見落としが残る。
図1 ── アクセス制御が「実装済み」と言えるかの判定。1つでも×があれば未完了として扱う

確認手順|2つのアカウントを作って往復する

  1. テスト用にアカウントを2つ作り、それぞれでデータを1件ずつ作る
  2. アカウントAでログインした状態のまま、URLやAPIのIDをBのものに書き換えて叩く
  3. データが返ってきたらその時点で穴。403または404が返るのが正しい
  4. 読み取りだけでなく更新と削除も同じ手順で試す

この検証の具体例はIDORの記事で扱っています。IDORはアクセス制御の失敗のうち、他人のIDを指定するだけで成立する形態を指します。

認可チェックの確認コストの試算 ── 何分かかるか
全件を他人のIDで叩き終わるまでの時間 60
  • 601時間(1回の作業で終わる範囲)
  • 1803時間(分割が必要な規模)

1本3分は、ブラウザの開発者ツールでIDを書き換えて再送し、結果を記録するまでの目安。自動テストに落とせば2回目以降はゼロになる。

余談 1回やって終わりにしない

この確認が効くのは実施した時点までです。機能を追加するたびにIDを受け取る経路は増え、そのたびに同じ穴が開きます。手作業の確認は初回の棚卸しに使い、以降はテストコードに落とすのが現実的だと編集部は考えています。上の試算で出た時間は、自動化すれば2回目から回収できる投資です。

Proactive controls prevent this by focusing on the development itself. Their idea is to prevent common vulnerabilities during an application's inception so that those tedious and embarrassing bug fixes can be avoided altogether.
出典OWASP Top 10 Proactive Controls 2024「Introduction」 一次情報を確認2026-08-16 この内容の有効期限2027-02-16

よくある質問

OWASP Top 10とProactive Controlsはどう違いますか?
Top 10は「何が起きているか」を集めた攻撃側の分類で、Proactive Controlsは「何を実装するか」を示した開発者向けの指針です。前者は現状把握、後者は着手順の決定に使います。両方とも1位はアクセス制御です。
入力値の検証を最優先すべきではないのですか?
重要ですが1位ではありません。2024年版では入力検証と例外処理がC3、アクセス制御がC1です。入力を完璧に検証しても、他人のデータを返す設計であれば防げないためです。
フレームワークを使っていれば安全ですか?
認証はフレームワークやサービスが提供しますが、認可は業務の仕様なので自分で書く必要があります。ログイン機能が動いた時点で「認証は済んだが認可は無い」状態になりやすく、ここが最も抜けやすい箇所です。
個人開発では何から始めればいいですか?
データを取得するクエリに所有者の条件が入っているかを全件確認することです。IDだけで引いている箇所があれば、そこが他人のデータを返す入口になります。

まとめ

  • 実装の優先順位はアクセス制御が1位。OWASPが2024年版で順序を入れ替えた
  • 攻撃の分類と開発の指針の両方が同じ場所を指している
  • 認可は取得条件に所有者を含めるだけで大半が防げる
  • 検証方法は他人のIDを入れて叩くこと。返ってきたら穴がある

今日から始められること

  1. データ取得のクエリを全件洗い出し、所有者の条件が入っているか確認する
  2. 他人のIDを指定して自分のAPIを叩き、データが返らないことを確かめる
  3. 認可に失敗したときのレスポンスが403か404で統一されているか確認する
  4. 管理者専用の操作に、役割の確認が入っているか確認する

実務で組んだセキュアコーディングのワークフローには、値段が付きます

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

出品の仕組みを見る