【PHP8.x】CURLOPT_DOH_URL定数の使い方
CURLOPT_DOH_URL定数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
CURLOPT_DOH_URL定数は、PHPのcURL拡張機能において、DNS-over-HTTPS (DoH) を利用する際のDoHリゾルバのURLを指定するために使用される定数です。この定数は、curl_setopt()関数に渡すオプションとして利用され、cURLによる名前解決の方法を制御します。
DNS-over-HTTPS (DoH) は、従来のDNS(Domain Name System)クエリを暗号化されたHTTPSプロトコル上で送信することで、DNS通信のプライバシーとセキュリティを向上させる技術です。通常のDNS通信は平文で行われるため、第三者による盗聴や改ざんのリスクがありましたが、DoHを利用することで、これらのリスクを軽減できます。
CURLOPT_DOH_URL定数を使用する際には、オプションの値として、HTTPSで提供されるDoHリゾルバのURLを文字列で指定します。例えば、「https://dns.google/dns-query」のようなURLを設定することで、cURLは通常のDNSサーバーに問い合わせる代わりに、指定されたDoHエンドポイントを通じてドメイン名の解決を行うようになります。これにより、アプリケーションはよりセキュアな環境下で通信相手のIPアドレスを取得できるようになります。
この機能はPHP 8以降で利用可能であり、ネットワーク通信の安全性を高めたい場合に非常に有用です。特に、機密性の高いデータを扱う通信や、公衆Wi-Fiのような信頼性の低いネットワーク環境下での利用において、DNS解決のプライバシーとセキュリティを強化する上で重要な役割を果たします。
構文(syntax)
1<?php 2$ch = curl_init(); 3curl_setopt($ch, CURLOPT_DOH_URL, "https://doh.example.com/dns-query"); 4curl_close($ch); 5?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
戻り値なし
戻り値はありません
サンプルコード
PHP cURLでDoHを使ってURLを取得する
1<?php 2 3/** 4 * DNS-over-HTTPS (DoH) を使用して指定されたURLからコンテンツを取得します。 5 * 6 * PHP 8で追加されたCURLOPT_DOH_URLオプションを使用して、 7 * DNSルックアップを従来のDNSではなくDoHサーバー経由で行います。 8 * これは、DNSクエリのプライバシーとセキュリティを向上させるのに役立ちます。 9 * 10 * @param string $targetUrl コンテンツを取得するターゲットURL。 11 * @param string $dohUrl 使用するDNS-over-HTTPS (DoH) サーバーのURL。 12 * 例: 'https://dns.google/dns-query' 13 * @return string|false 成功した場合は取得したコンテンツ、失敗した場合はfalseを返します。 14 */ 15function fetchContentWithDoh(string $targetUrl, string $dohUrl): string|false 16{ 17 // cURLセッションを初期化します。 18 $ch = curl_init(); 19 20 // cURL初期化が失敗した場合はエラーをログに記録し、falseを返します。 21 if ($ch === false) { 22 error_log('cURL の初期化に失敗しました。'); 23 return false; 24 } 25 26 // cURLオプションを設定します。 27 // ターゲットURLを設定します。 28 curl_setopt($ch, CURLOPT_URL, $targetUrl); 29 // 実行結果を文字列として返すように設定します。 30 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 31 // DNS-over-HTTPS (DoH) サーバーのURLを設定します。 32 // これにより、DNS解決が指定されたDoHサーバーを介して行われます。 33 curl_setopt($ch, CURLOPT_DOH_URL, $dohUrl); 34 // サーバーがHTTPエラーコード (4xx, 5xx) を返した場合にfalseを返します。 35 curl_setopt($ch, CURLOPT_FAILONERROR, true); 36 // User-Agentヘッダーを設定します (多くのWebサーバーで推奨されます)。 37 curl_setopt($ch, CURLOPT_USERAGENT, 'PHP DoH Client/1.0'); 38 39 // cURLセッションを実行し、結果を取得します。 40 $response = curl_exec($ch); 41 42 // cURL実行中にエラーが発生したかチェックします。 43 if (curl_errno($ch)) { 44 $errorMessage = curl_error($ch); 45 error_log("cURL エラー (コード: " . curl_errno($ch) . "): " . $errorMessage); 46 curl_close($ch); 47 return false; 48 } 49 50 // cURLセッションを閉じます。 51 curl_close($ch); 52 53 return $response; 54} 55 56// --- 使用例 --- 57// 取得したいウェブページのURL 58$targetUrl = 'https://www.example.com/'; 59// 使用するDNS-over-HTTPS (DoH) サーバーのURL (Google Public DNSを使用) 60$dohServerUrl = 'https://dns.google/dns-query'; 61 62echo "DoHサーバー '{$dohServerUrl}' を使用して '{$targetUrl}' からコンテンツを取得します...\n\n"; 63 64// 関数を呼び出してコンテンツを取得します。 65$content = fetchContentWithDoh($targetUrl, $dohServerUrl); 66 67// 取得結果に応じてメッセージを表示します。 68if ($content !== false) { 69 echo "コンテンツの取得に成功しました。先頭500文字:\n"; 70 echo substr($content, 0, 500) . "...\n"; 71} else { 72 echo "コンテンツの取得に失敗しました。エラーログを確認してください。\n"; 73}
このPHPのサンプルコードは、DNS-over-HTTPS(DoH)という技術を利用して、指定されたURLからウェブコンテンツを取得する方法を示しています。PHP 8で追加されたCURLOPT_DOH_URL定数を使用することで、ウェブサイトのアドレス解決(DNSルックアップ)を、従来のDNSではなく、よりプライバシーとセキュリティを向上させるDoHサーバー経由で行います。
fetchContentWithDoh関数は、コンテンツを取得したいウェブページのURL($targetUrl)と、使用するDNS-over-HTTPS(DoH)サーバーのURL($dohUrl)の二つを引数として受け取ります。例えば、'https://dns.google/dns-query'のようなDoHサーバーを指定できます。関数が正常に処理を終えると、取得したウェブページのコンテンツを文字列として返しますが、何らかの問題が発生した場合はfalseを返します。
関数内部では、まずcURLセッションを初期化し、CURLOPT_URLでターゲットURLを設定します。そして、最も重要なCURLOPT_DOH_URLオプションにDoHサーバーのURLを指定することで、DNSクエリがこのサーバーを介して行われます。これにより、DNS通信が暗号化され、プライバシー保護とセキュリティ強化に貢献します。その他、CURLOPT_RETURNTRANSFERで取得結果を文字列として返すように、CURLOPT_FAILONERRORでHTTPエラー時に失敗として扱うように設定しています。cURLセッションの実行後、エラーがなければコンテンツを返し、エラーが発生した場合はエラーをログに記録しfalseを返した後、セッションを閉じます。
このコードは、より安全でプライバシーに配慮した方法で、外部のウェブコンテンツを取得する際に非常に有用です。
このコードは、PHP 8で導入されたCURLOPT_DOH_URLオプションを利用し、DNS-over-HTTPS (DoH) を介したURLコンテンツ取得を例示しています。まず、この機能を使うにはPHP 8以降と、cURL拡張が有効になっている必要があります。CURLOPT_DOH_URLに指定するDoHサーバーは、信頼できるものを選んでください。不正なサーバーはセキュリティ上のリスクとなります。また、ネットワーク通信は予期せぬエラーが発生しやすいため、サンプルコードのようにcurl_errno()やcurl_error()で必ずエラーを確認し、curl_close()でリソースを適切に解放する堅牢なエラーハンドリングの実装が不可欠です。外部からのURLを受け取る場合は、必ずそのURLが安全かバリデーションする処理を追加してください。
PHP cURLでリダイレクト追跡する
1<?php 2 3/** 4 * 指定されたURLからコンテンツを取得します。 5 * HTTPリダイレクトを自動的に追跡する機能を含みます。 6 * 7 * @param string $url 取得するターゲットURL。 8 * @return string|false 成功した場合はURLのコンテンツ、失敗した場合はfalse。 9 */ 10function getUrlContentWithFollowLocation(string $url): string|false 11{ 12 // cURLセッションを初期化します。 13 $ch = curl_init(); 14 15 // cURLオプションを設定します。 16 // CURLOPT_URL: 取得したいURLを設定します。 17 curl_setopt($ch, CURLOPT_URL, $url); 18 19 // CURLOPT_RETURNTRANSFER: curl_exec() の戻り値を、取得した文字列として返します。 20 // true を指定しない場合、curl_exec() は直接結果を出力します。 21 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 22 23 // CURLOPT_FOLLOWLOCATION: HTTPヘッダの "Location:" にしたがってリダイレクトを追跡します。 24 // これにより、サイトが別のURLへユーザーを誘導した場合でも、最終的なコンテンツを取得できます。 25 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 26 27 // CURLOPT_DOH_URL はDNS over HTTPS (DoH) を利用する際に使用されるオプションです。 28 // これはDNSクエリを暗号化されたHTTPS接続経由で行うためのもので、 29 // 特定のDoHサーバーのURL(例: 'https://cloudflare-dns.com/dns-query')を設定します。 30 // 初心者向けには通常不要な設定であり、特定の利用シナリオでのみ必要になります。 31 // PHP 8.0以降で利用可能です。 32 // 例: curl_setopt($ch, CURLOPT_DOH_URL, 'https://cloudflare-dns.com/dns-query'); 33 34 // cURLリクエストを実行し、結果を取得します。 35 $response = curl_exec($ch); 36 37 // エラーが発生したかチェックします。 38 if (curl_errno($ch)) { 39 // エラーが発生した場合、エラーメッセージを表示し、falseを返します。 40 echo 'cURLエラー (' . curl_errno($ch) . '): ' . curl_error($ch) . PHP_EOL; 41 $response = false; 42 } 43 44 // cURLセッションを閉じます。 45 curl_close($ch); 46 47 return $response; 48} 49 50// --- 関数利用の例 --- 51// httpbin.org はテスト用のHTTPサービスを提供しており、/redirect/1 は一度リダイレクトを行います。 52$targetUrl = 'http://httpbin.org/redirect/1'; 53echo "URL: '{$targetUrl}' からコンテンツを取得中..." . PHP_EOL; 54 55$content = getUrlContentWithFollowLocation($targetUrl); 56 57if ($content !== false) { 58 echo "--- 取得したコンテンツの一部 ---" . PHP_EOL; 59 // 取得したコンテンツの最初の500文字を表示します(全文表示すると長くなるため)。 60 echo substr($content, 0, 500) . '...' . PHP_EOL; 61 echo "-------------------------------" . PHP_EOL; 62} else { 63 echo "コンテンツの取得に失敗しました。" . PHP_EOL; 64} 65 66?>
このPHPサンプルコードは、指定されたURLからWebコンテンツを取得するgetUrlContentWithFollowLocation関数を提供します。この関数の特徴は、Webサイトが別のURLへ誘導するHTTPリダイレクトを自動的に追跡し、最終的なコンテンツを取得できる点にあります。
関数は引数として取得したいURL(文字列)を受け取ります。処理が成功した場合はWebページのコンテンツを文字列として返し、何らかのエラーが発生した場合はfalseを返します。
内部ではPHPのcURLライブラリを利用し、Webリクエストを実行します。curl_init()でcURLセッションを開始し、curl_setopt()で様々な動作オプションを設定します。CURLOPT_URLでターゲットURL、CURLOPT_RETURNTRANSFERで取得したコンテンツを文字列として受け取るように設定します。最も重要なオプションであるCURLOPT_FOLLOWLOCATIONをtrueにすることで、Webサーバーからのリダイレクト指示に自動で従い、最終的なコンテンツにたどり着くことが可能になります。
CURLOPT_DOH_URLは、DNS over HTTPS(DoH)を利用するためのオプションで、DNSクエリを暗号化されたHTTPS接続経由で行う際に使用されますが、一般的なWebコンテンツ取得では通常は不要であり、特定の高度なシナリオでのみ必要となる設定です。
curl_exec()でリクエストを実行し、curl_errno()でエラーの有無を確認後、curl_close()でセッションを終了します。これにより、信頼性の高い方法でWebコンテンツを取得できます。
CURLOPT_FOLLOWLOCATIONは、ウェブサイトのリダイレクトを自動的に追跡する便利な機能ですが、無限リダイレクトループを防ぐため、CURLOPT_MAXREDIRSオプションで最大追跡回数を設定することをおすすめします。CURLOPT_DOH_URLはDNS over HTTPSを利用するためのオプションで、DNSクエリを暗号化しますが、特定のセキュリティ要件がない限り、初心者の方には通常設定不要です。外部のURLからコンテンツを取得する際は、常にそのURLの信頼性を確認し、悪意のあるコンテンツを取得しないよう十分注意してください。また、curl_execの実行後はcurl_errnoとcurl_errorでエラーの有無を必ず確認し、処理の最後にはcurl_closeでリソースを適切に解放することが安全で堅牢なコードのために非常に重要です。