現在の位置: ホーム> 最新記事一覧> parse_urlの堅牢性と境界の状況をテストする方法は?

parse_urlの堅牢性と境界の状況をテストする方法は?

gitbox 2025-05-26

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
)

1.リーガルURL形式をテストします

いくつかの一般的でよく構造化された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));
}

2。不完全な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は多くの場合、スキームホストなしで文字列の結果を返しますが、開発者は結果が不完全であるか、誤って解析されている可能性があることに注意する必要があります。

3.違法な形式と例外境界をテストします

$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)と組み合わせる必要があります。

4.特定のコンポーネントパラメーターを使用して、単一項目抽出をテストします

$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内のフィールドの特定の部分のみが必要なシナリオに適しており、不必要なアレイオーバーヘッドを回避できます。

5。マルチバイト文字とエンコーディングテスト

$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と組み合わせて使用​​できることに注意してください。

6.ビジネスシナリオとの組み合わせに焦点を当てます

特定のビジネスでは、さまざまな種類のURL(CDNリンク、サードパーティインターフェイス、ユーザー入力リンクなど)に異なる検証とフォールトトレランス戦略が必要です。例えば:

  • アップロードされたコンテンツのリンクの場合、 Parse_urlを最初に使用し、次にFilter_Varとドメイン名Whitelistsを使用する必要があります。

  • バックエンドスプライシングURLがスプライスされるシナリオの場合、XSSやSSRFなどのリスクを防ぐために、各部分の構成を強く検証する必要があります。

要約します

parse_urlは強力ですが、慎重に使用する必要もあります。さまざまな境界条件下でその動作を体系的にテストすることにより、その特性と制限をよりよく把握し、URLのフォールトトレランスとセキュリティを改善できます。上記のテストを自動化されたテストスクリプトにカプセル化し、実際のプロジェクトにおけるそれらの互換性と安定性を継続的に検証することをお勧めします。