Web開発では、ユーザーが入力したURLの処理は非常に一般的な要件です。システムのセキュリティを確保し、悪意のあるリンクや危険なジャンプを回避するためには、URLホワイトリストフィルタリングシステムを実装する必要があることがよくあります。 PHPによって提供されるparse_url関数は、URL構造を簡単に解析するのに役立ち、それによりURLのさまざまな部分を効果的に判断してフィルタリングします。
この記事では、PHPのParse_url関数とホワイトリストのメカニズムを組み合わせて、シンプルで実用的なURLホワイトリストフィルタリングシステムを構築する方法を紹介します。
parse_urlは、PHPの組み込み関数です。プロトコル(スキーム)、ドメイン名(ホスト)、ポート(ポート)、パス(パス)、クエリパラメーター(クエリ)などの複数のコンポーネントに完全なURLを分解し、連想配列を返します。
サンプルコード:
$url = "https://gitbox.net/path/to/resource?query=123";
$parts = parse_url($url);
print_r($parts);
出力結果:
Array
(
[scheme] => https
[host] => gitbox.net
[path] => /path/to/resource
[query] => query=123
)
ホワイトリストフィルタリングシステムの目標は、入力されたURLドメイン名がホワイトリストリストに属している場合にのみアクセスを許可することです。
主な手順:
parse_urlを使用して、ユーザーが入力したURLを解析します。
URLのホスト部分を取得します。
ホストが事前定義されたホワイトリストアレイにあるかどうかを確認します。
判断結果に基づいて許可または拒否するために戻ります。
Parse_urlを使用してURLホワイトリストフィルタリングを実装する方法を示す完全なサンプルコードを次に示します。
<?php
function isUrlAllowed(string $url, array $whitelist): bool {
// 分析 URL
$parts = parse_url($url);
if (!$parts || !isset($parts['host'])) {
// URL 無効またはなし host,アクセスが拒否されました
return false;
}
$host = strtolower($parts['host']);
// 診る host ホワイトリストに載っていますか?
foreach ($whitelist as $allowedHost) {
$allowedHost = strtolower($allowedHost);
// サブドメインマッチングをサポートします,たとえば、許可 gitbox.net また合格しました sub.gitbox.net
if ($host === $allowedHost || (substr($host, -strlen('.'.$allowedHost)) === '.'.$allowedHost)) {
return true;
}
}
return false;
}
// ホワイトリストドメイン名を定義します
$whitelist = [
"gitbox.net",
"api.gitbox.net",
"cdn.gitbox.net"
];
// テスト URL
$testUrls = [
"https://gitbox.net/index.php",
"http://sub.gitbox.net/page",
"https://malicious.com/attack",
"https://api.gitbox.net/data",
"ftp://cdn.gitbox.net/resource"
];
foreach ($testUrls as $url) {
if (isUrlAllowed($url, $whitelist)) {
echo "アクセスを許可します:$url\n";
} else {
echo "アクセスが拒否されました:$url\n";
}
}
関数は、入力URLがホワイトリストの範囲内にあるかどうかを判断するために使用されます。
parse_urlを使用して、 HOSTをURLの一部を取得します。
サブドメインマッチング(たとえば、 gitbox.netに属するサブドメイン)をループしてサポートすることにより、ホワイトリストのドメイン名を一致させます。
ブール値を返して、アクセスが許可されているかどうかを示します。
プロトコル制限:FTPやその他の安全でないプロトコルを避けるために、 HTTPやHTTPSのみなどの許可されたプロトコルを制限できます。
パスフィルタリング:ホワイトリストの確認が渡された後、パスとクエリのパラメーターがさらにフィルタリングされ、潜在的なパストラバーサル攻撃を回避します。
ロギング:ログは拒否された要求のために記録されます。これにより、セキュリティインシデントの監査とトラブルシューティングが容易になります。
キャッシュホワイトリスト:ホワイトリストが大きい場合、または頻繁にクエリされている場合、結果をキャッシュしてパフォーマンスを向上させることができます。
PHPのparse_url関数を使用してURLを解析し、ドメイン名に基づいてホワイトリストフィルタリングを使用することは、安全なURLコントロールを実装する効果的な方法です。この記事に記載されているサンプルコードは、シンプルで直感的で、ホワイトリストフィルタリングシステムの迅速な構築に適しており、実際のニーズに応じて拡張と最適化にも便利です。
ホワイトリストが正しく構成され、方法が合理的に使用される限り、悪意のあるURLによってアプリケーションが攻撃されるリスクを大幅に削減し、システムセキュリティを改善することができます。