📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)
ページの作成:「== 概要 == CORS (Cross-Origin Resource Sharing) は、Webブラウザにおけるセキュリティ機能の1つであり、異なるオリジン (ドメイン、プロトコル、ポート) 間でのリソース共有を制御する仕組みである。<br> <br> CORSが必要となった経緯において、以前のWebブラウザには<u>"同一オリジンポリシー"</u>という制限があり、あるWebサイトから別のドメインのリソースに…」 |
|||
| 30行目: | 30行目: | ||
*: header関数の使用 | *: header関数の使用 | ||
<br> | <br> | ||
また、開発時の注意点として、ワイルドカード (*) を使用して全てのオリジンを許可することは、本番環境では推奨されない。<br> | <u>また、開発時の注意点として、ワイルドカード (*) を使用して全てのオリジンを許可することは、本番環境では推奨されない。</u><br> | ||
必要最小限のオリジンのみを許可して、適切なセキュリティ設定を行うことが重要である。<br> | <u>必要最小限のオリジンのみを許可して、適切なセキュリティ設定を行うことが重要である。</u><br> | ||
<br><br> | |||
== PHPでのCORSの設定 == | |||
==== ヘッダ設定による方法 ==== | |||
<syntaxhighlight lang="php"> | |||
// 全てのドメインからのアクセスを許可する場合 | |||
// 開発時のテスト以外では避けて、本番環境では必要最小限のドメインのみ許可することが推奨される | |||
header("Access-Control-Allow-Origin: *"); | |||
// 特定のドメインからのアクセスのみ許可する場合 | |||
header("Access-Control-Allow-Origin: https://example.com"); | |||
// リクエストメソッドの設定 | |||
header("Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE"); | |||
// 許可するヘッダの設定 | |||
header("Access-Control-Allow-Headers: Content-Type, Authorization"); | |||
// 認証情報を含むリクエストを許可する場合 | |||
header("Access-Control-Allow-Credentials: true"); | |||
// プリフライトリクエストの結果をキャッシュする時間 (秒) | |||
header("Access-Control-Max-Age: 86400"); | |||
</syntaxhighlight> | |||
<br> | |||
==== 動的なオリジン制御 ==== | |||
<syntaxhighlight lang="php"> | |||
$allowed_origins = [ | |||
'https://example.com', | |||
'https://api.example.com' | |||
]; | |||
$origin = $_SERVER['HTTP_ORIGIN'] ?? ''; | |||
if (in_array($origin, $allowed_origins)) { | |||
header("Access-Control-Allow-Origin: " . $origin); | |||
header("Access-Control-Allow-Credentials: true"); | |||
} | |||
</syntaxhighlight> | |||
<br> | |||
==== 実装時の注意 ==== | |||
===== セキュリティ ===== | |||
PHPにおいて、<code>header("Access-Control-Allow-Origin: *");</code>は開発時のテスト以外では避けて、本番環境では必要最小限のドメインのみ許可することが推奨される。<br> | |||
<br> | |||
===== プリフライトリクエスト ===== | |||
特定の条件下 (カスタムヘッダの使用時等) では、Webブラウザは実際のリクエストの前にOPTIONSメソッドでプリフライトリクエストを送信する。<br> | |||
<br> | |||
以下の例では、プリフライトリクエストに適切に応答している。<br> | |||
<syntaxhighlight lang="php"> | |||
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { | |||
header("Access-Control-Allow-Origin: https://example.com"); | |||
header("Access-Control-Allow-Methods: GET, POST, OPTIONS"); | |||
header("Access-Control-Allow-Headers: Content-Type, Authorization"); | |||
header("Access-Control-Max-Age: 86400"); | |||
exit(0); | |||
} | |||
</syntaxhighlight> | |||
<br> | |||
==== エラーハンドリング ==== | |||
<syntaxhighlight lang="php"> | |||
try { | |||
// CORSヘッダの設定 | |||
if (!headers_sent()) { | |||
header("Access-Control-Allow-Origin: https://example.com"); | |||
} | |||
else { | |||
throw new Exception("Headers already sent"); | |||
} | |||
} | |||
catch (Exception $e) { | |||
error_log("CORS設定エラー : " . $e->getMessage()); | |||
} | |||
</syntaxhighlight> | |||
<br><br> | |||
== Apache2の場合 == | |||
==== .htaccessファイルによる設定 ==== | |||
<syntaxhighlight lang="apache"> | |||
<IfModule mod_headers.c> | |||
Header set Access-Control-Allow-Origin "*" | |||
Header set Access-Control-Allow-Methods "GET, POST, OPTIONS, PUT, DELETE" | |||
Header set Access-Control-Allow-Headers "Content-Type, Authorization" | |||
</IfModule> | |||
</syntaxhighlight> | |||
<br> | |||
<u>※注意</u><br> | |||
<u><code>Header set Access-Control-Allow-Origin "*"</code>の設定は、開発時のテスト以外では避けて、本番環境では必要最小限のドメインのみ許可することが推奨される。</u><br> | |||
<u>クレデンシャル (認証情報) を含むリクエストを許可する場合は、ワイルドカード (*) は使用できない。</u><br> | |||
<br><br> | <br><br> | ||