【入門編】CORS(Cross-Origin Resource Sharing)ポリシーの誤設定による情報漏洩 – アプリケーションセキュリティ & 安全な開発防御ガイド

玄関の鍵、誰にでも開けっ放しにしていませんか? CORS設定の落とし穴を徹底解説

こんにちは。セキュリティの現場に長くいると、「完璧なセキュリティなんて存在しない」という現実に直面することが多々あります。ですが、「防げるはずの泥棒」に合わないようにすることは十分に可能です。

今日は、Web開発の現場で非常によく見かける「CORS(Cross-Origin Resource Sharing)ポリシーの誤設定」についてお話しします。

「CORS? なんか難しそうな略語だな……」と思ったあなたも大丈夫。身近な「家の防犯」に例えて、なぜこの設定が重要なのか、どうすれば守れるのかを一緒に紐解いていきましょう。

—

1. CORSは「信頼できる来客」を識別するためのリスト

まず、CORSの役割を簡単に説明しますね。

Webブラウザには「同一生成元ポリシー(Same-Origin Policy)」という、「自分の家(サイトA)のものじゃないデータは、勝手に他人の家(サイトB)から持ち出しちゃダメ!」という強力な防犯ルールがあります。

しかし、最近のWebアプリは複雑です。サイトAからサイトBのAPIを呼び出してデータを表示したい、というケースは山ほどあります。そこで登場するのが「CORS」です。「このサイト(サイトB)は、サイトAからのアクセスなら許可しますよ」と、信頼できる相手をリストアップする許可証のようなものだと考えてください。

—

2. なぜ「ワイルドカード」が危険なのか?

ここで、開発者がついやってしまいがちな「一番やってはいけない設定」があります。それが、Access-Control-Allow-Origin: (ワイルドカード)の指定です。

これを家の鍵に例えると、「どんな不審者であっても、誰でもいつでも自由に家の中に入って物を持ち出していいですよ」と玄関に張り紙をしている状態です。

攻撃者はどうやって盗むのか?

悪意のある攻撃者は、あなたのWebサイトの裏側にある「個人情報が詰まったAPI」を狙っています。あなたがワイルドカードを設定していると、攻撃者が用意した偽サイトにユーザーがアクセスした瞬間、その偽サイトがユーザーのブラウザ経由で「あなたのAPI」を叩き、ユーザーのログイン情報(クッキーなど)を使ってデータを根こそぎ盗み出してしまうのです。

「自分は悪さをしていないから大丈夫」なんて思っていませんか? 攻撃者は、あなたのサーバーを「悪意ある第三者」への踏み台として利用するのです。

—

3. 正しい「鍵の掛け方」を覚えよう

では、どうすれば安全な設定ができるのでしょうか。ポイントは「必要最小限の相手だけをホワイトリスト化する」ことです。

NGな設定(ワイルドカード)

誰でも許可!絶対にダメな設定です
Access-Control-Allow-Origin:

OKな設定(信頼できるドメインのみ許可)

サーバー側のプログラムで、アクセスしてきた相手(Origin)を確認し、リストに載っている場合のみ許可を返します。

(例:Node.js / Expressでの実装イメージ)

const allowedOrigins = [‘https://www.your-trusted-site.com’];

app.use((req, res, next) => {
const origin = req.headers.origin;

// アクセスしてきた相手がリストにあるか確認
if (allowedOrigins.includes(origin)) {
// 許可するドメインだけを動的に指定する
res.setHeader(‘Access-Control-Allow-Origin’, origin);
}

// 他の必要な設定
res.setHeader(‘Access-Control-Allow-Methods’, ‘GET, POST’);
next();
});

このように、「リストに載っている場合のみ、そのドメインを許可して返す」という動的な処理を行うのが、現代のWebセキュリティの基本です。

—

4. 「正規表現」の罠にも注意!

「ドメインがたくさんあるから、正規表現で楽をしたいな」と考える方も多いでしょう。しかし、ここでよくあるミスが、ドメインの一部しかチェックしていない正規表現です。

例えば、^https://.\.example\.com$ という設定。これだと、https://hacker.example.com.evil-site.com という悪意あるサイトからもアクセスを通してしまう可能性があります。

教訓:正規表現を使うなら、完全一致に近い厳密なチェックを! 可能な限り、許可するドメインリストを配列で持ち、一字一句マッチさせるのが最も安全で確実です。

—

最後に:セキュリティは「面倒くさい」のその先にある

「いちいちアクセス元をチェックするなんて面倒くさい」と感じるかもしれません。でも、泥棒がドアを開けた瞬間に警報が鳴るように、Webサーバーも「誰が来ているか」を常に監視する必要があります。

まずは、自分の開発しているサイトのレスポンスヘッダーを確認してみてください。もしそこに Access-Control-Allow-Origin: が輝いていたら、それは今すぐ直すべき「防犯上の欠陥」です。

一歩ずつ、確実に。あなたの手で、ユーザーの大切なデータを守り抜いていきましょう!

もし設定方法で迷ったら、いつでもこの記事を見返してくださいね。安全な開発ライフを応援しています!

コメント

タイトルとURLをコピーしました