Parse_urlは、URLを解析するためのPHPに組み込み関数です。スキーム、ホスト、ポート、パス、クエリ、フラグメントなどのコンポーネントにURL文字列を解析できます。 URL形式は多様であり、URLソースは実際の開発で制御されない可能性があるため、 Parse_URLの包括的な境界テストを実施することが重要です。この記事では、複数の視点から始まり、 Parse_URL関数の堅牢性を体系的にテストし、いくつかのテストケースを提供する方法を紹介します。
$url = "https://gitbox.net:8080/path/to/resource?query=123#section";
$parts = parse_url($url);
print_r($parts);
出力は次のとおりです。
Array
(
[scheme] => https
[host] => gitbox.net
[port] => 8080
[path] => /path/to/resource
[query] => query=123
[fragment] => section
)
いくつかの一般的でよく構造化されたURLの場合、 parse_urlの動作は一般に期待を満たします。検証のために、次のテストサンプルを準備できます。
$urls = [
"http://gitbox.net",
"https://gitbox.net/path",
"ftp://user:[email protected]:21/dir/file.txt",
"http://gitbox.net:8000/?q=test#frag",
"//gitbox.net/path", // scheme-relative
];
foreach ($urls as $url) {
echo "Testing: $url\n";
print_r(parse_url($url));
}
$urls = [
"gitbox.net", // なし scheme
"/relative/path", // 相対パス
"mailto:[email protected]", // mailto プロトコル
"file:///C:/path.txt", // file プロトコル
"http:///path", // 足らない host
":123", // ポートのみ?
];
foreach ($urls as $url) {
echo "Testing: $url\n";
print_r(parse_url($url));
}
これらのテストでは、 Parse_urlは多くの場合、スキームやホストなしで文字列の結果を返しますが、開発者は結果が不完全であるか、誤って解析されている可能性があることに注意する必要があります。
$urls = [
"http://", // のみ scheme
"http://:@:/", // 空のユーザー名とパスワード
"://gitbox.net", // 足らない scheme 名前
"http://gitbox.net:-80", // ポートは負です
"http://git box.net", // 違法なスペース
"\0http://gitbox.net", // 含む null キャラクター
];
foreach ($urls as $url) {
echo "Testing: $url\n";
print_r(parse_url($url));
}
parse_urlは、これらの文字列の誤った結果を返すか、結果を解析する場合があります。実際の開発では、filter_var($ url、filter_validate_url)をfilter_var($ url、filter_validate_url)と組み合わせる必要があります。
$url = "https://gitbox.net:443/path?arg=value#frag";
$components = [PHP_URL_SCHEME, PHP_URL_HOST, PHP_URL_PORT, PHP_URL_PATH, PHP_URL_QUERY, PHP_URL_FRAGMENT];
foreach ($components as $component) {
var_dump(parse_url($url, $component));
}
この方法は、URL内のフィールドの特定の部分のみが必要なシナリオに適しており、不必要なアレイオーバーヘッドを回避できます。
$urls = [
"http://gitbox.net/パス",
"http://gitbox.net/search?q=テスト",
"http://gitbox.net/%E4%B8%AD%E6%96%87", // URL encoded
];
foreach ($urls as $url) {
echo "Testing: $url\n";
print_r(parse_url($url));
}
Parse_urlはURLを自動的にデコードせず、開発者はurldecodeまたはrawurldecodeと組み合わせて使用できることに注意してください。
特定のビジネスでは、さまざまな種類のURL(CDNリンク、サードパーティインターフェイス、ユーザー入力リンクなど)に異なる検証とフォールトトレランス戦略が必要です。例えば:
アップロードされたコンテンツのリンクの場合、 Parse_urlを最初に使用し、次にFilter_Varとドメイン名Whitelistsを使用する必要があります。
バックエンドスプライシングURLがスプライスされるシナリオの場合、XSSやSSRFなどのリスクを防ぐために、各部分の構成を強く検証する必要があります。
parse_urlは強力ですが、慎重に使用する必要もあります。さまざまな境界条件下でその動作を体系的にテストすることにより、その特性と制限をよりよく把握し、URLのフォールトトレランスとセキュリティを改善できます。上記のテストを自動化されたテストスクリプトにカプセル化し、実際のプロジェクトにおけるそれらの互換性と安定性を継続的に検証することをお勧めします。