記事

JavaScriptセキュリティ完全ガイド【2025年最新版】|セキュアコーディングから多層防御の考え方まで徹底解説

JavaScriptセキュリティ完全ガイド【2025年最新版】|セキュアコーディングから多層防御の考え方まで徹底解説
目次

「自分の書いたJavaScriptコードが原因で、セキュリティインシデントを引き起こしてしまったらどうしよう」
「利用している外部ライブラリは本当に安全なのだろうか」

Webアプリケーション開発に携わるエンジニアであれば、このような不安を一度は感じたことがあるのではないでしょうか。現代のWebサービスにおいてJavaScriptは中心的な役割を担っており、その影響力は増すばかりです。
しかし、その一方で、JavaScriptに潜む脆弱性を狙ったサイバー攻撃も巧妙化・多様化しており、開発者にはこれまで以上に高度なセキュリティ知識が求められています

この記事では、JavaScript開発における主要なセキュリティリスクを体系的に整理します。XSS(クロスサイトスクリプティング)やCSRF(クロスサイトリクエストフォージェリ)といった代表的な脆弱性について、その仕組みから具体的な攻撃手法、そして実践的な対策までを深く掘り下げて解説します

さらに、開発プロセスにすぐに取り入れられる「セキュアコーディング」の原則や、アプリケーションをより堅牢にするための多層防御の考え方も紹介します。本記事を読み終える頃には、あなたはセキュリティに対する漠然とした不安を解消し、自信を持って安全なコードを書くための確かな知識を身につけているはずです。

なぜ今、JavaScriptのセキュリティが重要なのか?開発者が知るべき現状

現代のWebアプリケーションにおいて、JavaScriptの役割は単なるアニメーションや動的な表現に留まりません。
シングルページアプリケーション(SPA)の普及により、画面遷移やデータ処理の多くがユーザーのブラウザ上(クライアントサイド)で実行されるようになりました
これにより、アプリケーションの応答性は飛躍的に向上しましたが、同時にクライアントサイドで扱うデータの重要性も増し、セキュリティリスクは格段に高まっています

実際に、外部のJavaScriptライブラリの脆弱性を突かれた大規模な情報漏洩事件も発生しています。例えば、2018年に発生したBritish Airwaysの事例では、改ざんされた外部ライブラリ経由で約38万件ものクレジットカード情報が盗まれました
これは、npmなどで手軽に導入できるサードパーティのライブラリが、知らず知らずのうちにシステム全体のアキレス腱になり得る「サプライチェーンリスク」の脅威を示す典型例です。
もはや、JavaScriptのセキュリティ対策は他人事ではなく、すべてのWeb開発者が当事者意識を持って取り組むべき喫緊の課題といえるでしょう

【全体像】JavaScriptに潜む代表的な脆弱とそのリスク

JavaScript開発において特に注意すべき脆弱性は多岐にわたります。ここでは、まず代表的な脆弱性を網羅的に紹介し、それぞれがどのような攻撃を可能にし、ビジネスにどのようなリスクをもたらすのか、その全体像を掴んでいきましょう
XSSやCSRFといった古典的な脅威に加え、近年のWeb開発環境の変化に伴い注目されるようになった新たな脅威についても触れていきます。

① クロスサイトスクリプティング(XSS)- 最も警戒すべき脅威

XSS(クロスサイトスクリプティング)は、攻撃者がWebアプリケーションの脆弱性を利用して悪意のあるスクリプトを注入し、他のユーザーのブラウザ上で実行させる攻撃です。
これにより、ユーザーのCookie情報(セッションIDなど)の窃取、個人情報の漏洩、Webサイトの改ざんといった深刻な被害が発生する可能性があります。
XSSは、その手口によって大きく3つの種類に分類されます。

種類 概要 攻撃シナリオの例
反射型
(Reflected) XSS
悪意のあるスクリプトがURLパラメータなどに含まれ、サーバーがその値をそのままレスポンスに含めて返すことで実行される。 罠サイトのリンクをクリックすると、URLに含まれたスクリプトが正規サイト上で実行され、Cookieが盗まれる。
格納型
(Stored) XSS
悪意のあるスクリプトがデータベースなどに保存され、その情報を含むページをユーザーが閲覧した際に実行される。 掲示板にスクリプトを埋め込んだ投稿を行い、その投稿を閲覧した他の全ユーザーの情報を盗む。
DOMベース
(DOM-based) XSS
サーバーを介さず、ブラウザ上のJavaScriptがDOMを不正に操作することでスクリプトが実行される。 URLの#以降(フラグメント)を読み取って画面表示するJavaScriptに脆弱性があり、細工されたURLからスクリプトが実行される。

特にDOMベースXSSは、SPAのようにクライアントサイドでDOMを動的に書き換える現代的なアプリケーションで問題になりやすい脆弱性です。
例えば、以下のようなコードはDOMベースXSSの脆弱性を持ちます。

// URLからパラメータを取得
const urlParams = new URLSearchParams(window.location.search);
const name = urlParams.get('name');

// 危険なinnerHTMLを使用してDOMに挿入
document.getElementById('greeting').innerHTML = 'Hello, ' + name;

このコードは、URLのnameパラメータをエスケープせずにinnerHTMLで画面に表示しています。
もし攻撃者が http://example.com/?name=<img src=x on-error=alert(1)> のようなURLをユーザーにクリックさせると、ユーザーのブラウザ上で意図しないスクリプトが実行されてしまいます。
さらに、攻撃者はエンコードを駆使するなどして単純なXSSフィルターをバイパスしようと試みるため、対策は一筋縄ではいきません。

② クロスサイトリクエストフォージェリ(CSRF)- 意図しないリクエストの強制

CSRF(クロスサイトリクエストフォージェリ)は、ユーザーがログインしているWebサービスに対し、そのユーザーの意図しないリクエストを強制的に送信させる攻撃です。
「リクエスト強要」とも呼ばれ、ユーザーが気づかないうちに投稿の削除、パスワードの変更、商品の購入、不正な送金といった操作を行わせることが可能です。

攻撃者は、罠を仕掛けたWebサイトに以下のようなコードを埋め込みます。
ユーザーがそのサイトを閲覧すると、ブラウザは自動的にターゲットのWebサイト(例:http://example.com)に対してリクエストを送信してしまいます。
もしユーザーがexample.comにログイン済みであれば、そのリクエストは正規のユーザーによる操作として処理されてしまいます。

<!-- ユーザーがページを開くと自動でフォームが送信される -->
<form action="http://example.com/transfer" method="POST" name="csrf_form">
 <input type="hidden" name="to_account" value="attacker_account">
 <input type="hidden" name="amount" value="100000">
</form>
<script>document.csrf_form.submit();</script>

この攻撃が成立するのは、ブラウザがリクエストを送信する際に、そのドメインに紐づくCookie(セッション情報など)を自動的に付与してしまう仕様に起因します。

③ サプライチェーン攻撃 - 脆弱なライブラリが招くリスク

現代のWeb開発において、npmなどを通じて外部のライブラリやフレームワークを利用することは一般的です。
これにより開発効率は飛躍的に向上しますが、一方で新たなリスクも生まれています。
それが「ソフトウェアサプライチェーン攻撃」です。

これは、多くの開発者が利用するライブラリ自体に悪意のあるコードを仕込んだり、ライブラリの脆弱性を悪用したりすることで、そのライブラリを利用するすべてのアプリケーションを標的とする攻撃手法です。
ECサイトを標的とし、決済ページで入力されたクレジットカード情報を盗む攻撃を繰り返す「Magecart」グループはその典型例です。
彼らは、サイトが利用しているサードパーティのJavaScriptライブラリを改ざんすることで、広範囲にわたる情報漏洩を引き起こしました。
このように、自作のコードが安全でも、依存しているライブラリの一つに問題があれば、アプリケーション全体が危険に晒されます。
そのため、依存関係にあるライブラリの脆弱性を適切に管理することが極めて重要です。

④ 新たな脅威 - Prototype Pollution, ReDoS, Clickjackingなど

XSSやCSRFといった既知の脅威に加え、開発者は常に新しい攻撃手法にも注意を払う必要があります
ここでは、特に近年注目されている3つの脅威について簡潔に紹介します。

脅威 概要 リスク
Prototype Pollution JavaScriptのプロトタイプチェーンの仕組みを悪用し、全オブジェクトの挙動を意図せず変更する攻撃[3]。
  • アプリケーション全体の予期せぬ動作
  • 権限昇格
  • サービス停止
  • XSSの誘発 など
ReDoS
(正規表現DoS)
処理に時間がかかる非効率な正規表現(Evil Regex)を悪用し、サーバーやブラウザを過負荷状態に陥らせるDoS攻撃。
  • サーバーダウン
  • サービスの応答不能
  • ユーザー体験の著しい悪化
Clickjacking 透明な<iframe>などを悪用して正規のページの上に罠を重ね、ユーザーを騙して意図しないボタンなどをクリックさせる攻撃。
  • 意図しないSNSの「いいね」
  • 商品購入
  • アカウント情報の変更 など

これらの攻撃は、従来の対策だけでは防ぎきれない場合があり、JavaScriptの言語仕様やブラウザの挙動に対する深い理解が求められます。
常に最新の脆弱性情報を収集し、知識をアップデートし続ける姿勢が不可欠です。

【実践対策】明日から使える!セキュアコーディング 5つの鉄則

脆弱性の仕組みを理解したところで、次はそのリスクを未然に防ぐための具体的なコーディング手法を学びましょう。
ここでは、日々の開発業務にすぐに取り入れられる、特に重要な5つの「セキュアコーディングの鉄則」を紹介します。これらの原則を意識するだけで、あなたの書くコードは格段に安全になります

鉄則1:入力値は無害化する(サニタイズ・エスケープ)

セキュリティの基本原則は「すべての入力は信頼しない」ということです
ユーザーからの入力値はもちろん、APIから受け取ったデータやURLのパラメータなど、外部から渡される値はすべて悪意のあるコードを含んでいる可能性があると考えるべきです。
XSS攻撃を防ぐ最も基本的かつ重要な対策が、出力時の「エスケープ処理」と入力時の「サニタイズ」です。

  • エスケープ処理: HTML上で特別な意味を持つ文字を、無害な文字列(HTMLエンティティ)に置き換える処理です。
    • <&lt;
    • >&gt;
    • &&amp;
    • "&quot;
    • '&#39;
  • サニタイズ: 入力値から悪意のあるコードや不要なタグそのものを除去する処理です。

これらの処理を自前で実装するのは非常に困難で、漏れが生じやすいため、実績のあるライブラリを利用することを強く推奨します。
例えば、クライアントサイドでのHTMLサニタイズには「DOMPurify」が広く利用されています。

鉄則2:安全なAPI・DOM操作を徹底する(textContentの活用)

DOMベースXSSの多くは、文字列をHTMLとして解釈・実行してしまう危険なDOM操作が原因で発生します。
特にelement.innerHTMLは、渡された文字列をHTMLとしてパースするため、スクリプトを容易に実行できてしまい非常に危険です。
動的にテキストを画面に表示する際は、原則としてelement.textContentを使用するべきです。
textContentは、渡された文字列を単なるテキストとして扱うため、HTMLタグが含まれていても解釈・実行されることはありません。

同様に、文字列をJavaScriptコードとして実行するeval()関数の使用は絶対に避けるべきです。
JSON形式の文字列をパースする場合は、必ずJSON.parse()を使用してください。
ReactのdangerouslySetInnerHTMLやVue.jsのv-htmlのように、フレームワークが提供する機能にも同様のリスクが潜んでいるため、使用する際はその危険性を十分に理解し、必ずサニタイズ処理と組み合わせて利用する必要があります。

鉄則3:機密情報をフロントエンドに保存しない

APIキー、認証トークン、パスワードといった機密情報をJavaScriptのコード内に直接書き込んだり(ハードコーディング)、ブラウザのlocalStoragesessionStorageに保存したりすることは絶対に避けてください
フロントエンドのコードやストレージは、ブラウザの開発者ツールを使えば誰でも容易に内容を確認できてしまうため、機密情報を置く場所として全く安全ではありません。

これらの情報は、必ずサーバーサイドで環境変数などを用いて安全に管理し、クライアントサイドには渡さない設計にすることが基本です。
認証状態を管理する必要がある場合でも、セッションIDのような直接的な意味を持たない情報を、後述するHttpOnly属性を付けたCookieで管理するなど、漏洩時のリスクを最小限に抑える工夫が求められます。

鉄則4:依存関係を定期的にチェックする(npm audit

サプライチェーン攻撃のリスクに対抗するためには、自身が利用しているライブラリやフレームワーク(依存関係)に既知の脆弱性がないかを継続的に監視することが不可欠です。
幸い、npmやyarnといったパッケージマネージャには、プロジェクトの依存関係をスキャンし、脆弱性を報告してくれる便利な機能が組み込まれています。

ターミナルで以下のコマンドを実行するだけで、簡単に脆弱性チェックを行えます。

  • npmの場合: npm audit
  • yarnの場合: yarn audit

このコマンドは、脆弱性が発見されたパッケージ名、脆弱性の深刻度、影響を受けるバージョン範囲などを報告してくれます。
多くの場合、npm audit fixコマンドで自動的に安全なバージョンに更新することも可能です。
この監査プロセスをCI/CDパイプラインに組み込むことで、脆弱なコードが本番環境にデプロイされるのを自動的に防ぐことができます。

鉄則 チェックポイント
鉄則1: 入力値は無害化 ユーザーからの入力値や外部データを画面に出力する際、エスケープまたはサニタイズ処理を行っているか?
鉄則2: 安全なAPI・DOM操作 innerHTMLeval()のような危険なAPIを避け、textContentなど安全な代替手段を使用しているか?
鉄則3: 機密情報を保存しない APIキーなどをフロントエンドのコードやlocalStorageに保存していないか?
鉄則4: 依存関係を定期的にチェック npm auditなどを定期的に実行し、利用しているライブラリに既知の脆弱性がないか確認しているか?

【多層防御】アプリケーションをさらに堅牢にする追加施策

セキュアコーディングは個々の開発者が実践すべき重要な対策ですが、それだけでは万全とは言えません。
アプリケーション全体を保護するためには、ブラウザが提供するセキュリティ機能を活用し、複数の防御壁を築く「多層防御」の考え方が重要になります
ここでは、主にHTTPヘッダーをサーバーから送信することで実現できる、より強力な追加施策を紹介します。

Content Security Policy (CSP) でスクリプト実行を制御する

CSPは、XSS攻撃に対する非常に強力な防御メカニズムです。
これは、Webページが信頼できるリソース(スクリプト、スタイルシート、画像など)をどこから読み込んで良いかを、HTTPレスポンスヘッダーで明示的に宣言する仕組みです。
ブラウザは、このポリシーに違反するリソースの読み込みや実行をブロックします。

例えば、以下のようなCSPヘッダーを設定すると、スクリプトは自ドメインとhttps://apis.google.comからのみ読み込みが許可されます。
これにより、たとえXSS脆弱性によって不正な<script>タグが注入されても、その実行を未然に防ぐことができます。

Content-Security-Policy: script-src 'self' https://apis.google.com;

さらに、インラインスクリプトの実行を原則禁止し、nonce(一度だけ使えるランダムな値)やhashを用いて例外的に許可する「Strict CSP」を導入することで、セキュリティレベルをより一層高めることが可能です。

ディレクティブ 説明 設定例
default-src 他のディレクティブで指定がない場合のリソースのデフォルト読み込み元を指定します。 default-src 'self';
(自ドメインのみ許可)
script-src JavaScriptファイルの読み込み元を指定します。 script-src 'self' https://trusted.cdn.com;
style-src CSSファイルの読み込み元を指定します。 style-src 'self' 'unsafe-inline';
img-src 画像ファイルの読み込み元を指定します。 img-src 'self' data:;
(自ドメインとdata URIを許可)
frame-ancestors <iframe>などでページを埋め込むことを許可するオリジンを指定します。(Clickjacking対策) frame-ancestors 'none';
(埋め込みを一切禁止)
report-uri / report-to CSP違反が発生した際にレポートを送信する先を指定します。 report-to /csp-violations;

CSPの設定は複雑になりがちですが、CSP Evaluatorのようなツールを使えば、設定内容の妥当性を簡単にチェックできます。

Subresource Integrity (SRI) でCDNの改ざんを防ぐ

jQueryやBootstrapなどのライブラリをCDN(コンテンツデリバリーネットワーク)から読み込むことは、パフォーマンス向上の観点から広く行われています。
しかし、もしCDNがサイバー攻撃を受け、配信されているライブラリファイルが悪意のあるコードに改ざんされた場合、そのライブラリを読み込んでいる全てのWebサイトが影響を受けてしまいます。

このリスクを防ぐのがSRI(サブリソース完全性)です。
<script>タグや<link>タグにintegrity属性を追加し、リソースファイルのハッシュ値を指定しておくだけで、ブラウザがファイルをダウンロードした際にその内容が期待通り(改ざんされていない)かを確認してくれます
もしハッシュ値が一致しない場合、ブラウザはそのリソースの読み込みをブロックします。

<script
 src="https://code.jquery.com/jquery-3.6.0.min.js"
 integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4="
 crossorigin="anonymous"
></script>

integrity属性の値は[ハッシュアルゴリズム]-[Base64エンコードされたハッシュ値]という形式で記述します。
ハッシュ値の生成には、SRI Hash Generatorなどのオンラインツールが便利です。

HttpOnly属性でCookieの盗難を防止する

XSS攻撃の主な目的の一つに、ユーザーのセッションIDなどが保存されたCookieを盗み出し、そのユーザーになりすます「セッションハイジャック」があります。
このリスクを軽減する非常に効果的な対策が、サーバーがCookieを発行する際にHttpOnly属性を付与することです。

HttpOnly属性が設定されたCookieは、JavaScriptのdocument.cookieからアクセスすることができなくなります
そのため、たとえWebサイトにXSS脆弱性が存在し、攻撃者が任意のスクリプトを実行できたとしても、Cookieを盗み出すことは困難になります。
認証情報など、サーバーとの通信にのみ必要なCookieには、必ずこの属性を設定するべきです。

Set-Cookie: session_id=...; HttpOnly; Secure

【独自解説】WAFやCSPの限界とクライアントサイドセキュリティの重要性

これまで様々な対策を紹介してきましたが、WAF(Web Application Firewall)やCSPといった従来のセキュリティ対策だけでは、巧妙化するクライアントサイドの脅威を完全に防ぐことは困難になっています。
WAFは主にサーバーサイドへの攻撃を防ぐものであり、ユーザーのブラウザ上で実行されるスクリプトの挙動までは監視できません
また、CSPは強力ですが、許可したドメインから配信されるスクリプト自体の安全性を保証するものではなく、設定が複雑で運用が難しいという課題もあります

特に、現代のWebサイトが依存している多数のサードパーティスクリプト(広告タグ、解析ツール、各種ウィジェットなど)は、セキュリティ上の大きなブラックボックスとなっています。
これらのスクリプトは企業の管理外で動作し、脆弱性があれば情報漏洩やサイト改ざんの侵入口となり得ます。
この課題を解決するためには、クライアントサイドで動作するスクリプトそのものを直接「可視化」し、「制御」する新たなアプローチが不可欠です。

Spider AF SiteScanによる外部スクリプトの可視化と制御

弊社が提供する「Spider AF SiteScan」は、まさにこのクライアントサイドのセキュリティ課題を解決するために開発されたソリューションです。
WAFやCSPでは手の届かなかった領域をカバーし、可視化・制御・対応の3つの軸で包括的なサポートを提供します。

機能軸 Spider AF SiteScanで実現できること
可視化
  • スクリプトインベントリ:
    サイト上で動作する全ての外部スクリプトをリスト化し、どこから読み込まれ、どのような挙動をしているかを把握できます。
  • リアルタイム監視:
    新たなスクリプトが追加・変更された際に即座に検知し、アラートを通知します。
制御
  • 実行制御:
    リスクが高いと判断されたスクリプトや不要なスクリプトを、ドメイン単位やページ単位でブロック・一時停止できます。
  • ホワイトリスト運用:
    信頼できるスクリプトのみを許可し、意図しないスクリプトの実行を未然に防ぎます。
対応
  • リスクスコアリング:
    新たに検出されたスクリプトの危険度を自動で評価し、対応の優先順位付けを支援します。
  • パフォーマンス分析:
    スクリプトがページの表示速度に与える影響を分析し、ボトルネックを特定。UX改善に繋げます。

Spider AF SiteScanを導入することで、企業はこれまで管理が難しかったサードパーティスクリプトのリスクをコントロール下に置くことができます

\タグのリスクを自動で可視化・防御/ セキュリティツール
Spider AF SiteScan
サービス詳細はこちら

まとめ:セキュリティを強みとし、信頼されるエンジニアへ

本記事では、JavaScriptに潜む主要な脆弱性から、セキュアコーディングの実践、そして多層防御の考え方まで、幅広く解説しました。

  • 脆弱性の理解: XSS、CSRF、サプライチェーン攻撃などの仕組みとリスクを把握することが第一歩です。
  • セキュアコーディングの実践: 「入力値の無害化」「安全なAPIの使用」「機密情報をフロントに置かない」「依存関係のチェック」を日々の開発で徹底しましょう。
  • 多層防御の導入: CSP、SRI、HttpOnly属性といったブラウザのセキュリティ機能を活用し、防御壁を何重にも構築することが重要です。
  • 新たな対策の検討: WAFやCSPの限界を認識し、「Spider AF SiteScan」のようなクライアントサイドを直接保護するソリューションの導入も視野に入れましょう。

JavaScriptのセキュリティ対策は、一度行えば終わりというものではありません。新たな脅威は次々と現れ、常に知識をアップデートし続ける必要があります。
しかし、この継続的な学習と実践こそが、あなたを単なる「コードが書けるエンジニア」から「ユーザーとビジネスを守れる、信頼されるエンジニア」へと成長させる原動力になります
本記事が、そのための確かな一歩となることを願っています。

\タグのリスクを自動で可視化・防御/ セキュリティツール
Spider AF SiteScan
サービス詳細はこちら
No items found.
SpiderAF
アドフラウド
Spider Labs