현재 위치: > 최신 기사 목록> URL에 @ 문자가 포함 된 경우 parse_url의 특별 처리

URL에 @ 문자가 포함 된 경우 parse_url의 특별 처리

gitbox 2025-05-20

URL에 URL을 처리하기 위해 PHP의 parse_url 함수를 사용하는 경우 URL에 @ 기호가 포함되어 있으면 구문 분석 오류가 발생하거나 결과가 기대치와 일치하지 않습니다. 이 동작은 종종 인증 정보 또는 복잡한 쿼리 매개 변수를 포함하는 URL을 처리 할 때 개발자를 혼동합니다.

이 기사는이 문제의 근본 원인을 분석하고 응답 전략을 제공합니다.

@ 기호의 의미

URL에서 @는 특별한 의미를 가진 캐릭터입니다. RFC 3986 에 따르면 사용자 정보 (사용자 정보)와 호스트 이름을 분리하는 데 사용됩니다. 예를 들어:

 http://user:[email protected]/path

이 예에서 :

  • 사용자 이름은 사용자 입니다

  • 암호는 패스 입니다

  • 호스트는 gitbox.net 입니다

PHP의 parse_url 은이 표준에 따라 URL을 구문 분석합니다.

문제가 발생하는 시나리오

문제는 일반적으로 @ 기호가 비 승인 정보에 나타날 때 발생합니다. 예를 들어:

 $url = 'http://gitbox.net/path@something';
$parsed = parse_url($url);
print_r($parsed);

출력이 다음과 같은 것으로 기대할 수 있습니다.

 Array
(
    [scheme] => http
    [host] => gitbox.net
    [path] => /path@something
)

그러나 실제 출력은 다음과 같습니다.

 Array
(
    [scheme] => http
    [host] => something
    [user] => gitbox.net
    [path] => /
)

Parse_url은 이전 부분이 @ Symbol을 발견 한 후 사용자 정보라고 자동으로 생각하기 때문입니다. URL에 인증 정보가 포함되어 있지 않더라도 표준에 따라 여전히 구문 분석됩니다.

더 극단적 인 예

 $url = 'http://foo@[email protected]/';
print_r(parse_url($url));

출력은 다음과 같습니다.

 Array
(
    [scheme] => http
    [user] => foo
    [pass] => bar
    [host] => gitbox.net
    [path] => /
)

여기서는 PHP가 foo@bar를 사용자 : pass : pass로 인식하고 gitbox.net은 그 후 호스트 이름입니다.

대처 전략

1. encoding @ ar

URL의 @가 사용자의 인증 정보의 일부가되어서는 안된다는 것을 알고 있으면 %40 으로 인코딩 할 수 있습니다. 예를 들어:

 $url = 'http://gitbox.net/path%40something';
print_r(parse_url($url));

출력은 다음과 같습니다.

 Array
(
    [scheme] => http
    [host] => gitbox.net
    [path] => /path@something
)

이것은 @ 의 의미를 잘못 판단하는 parse_url을 피할 수 있습니다.

2. 정기적 인 보조 URL 청소를 사용하십시오

URL 소스 (예 : 사용자 입력 또는 타사 데이터)를 제어 할 수없는 경우 Parse_URL을 호출하기 전에 정기적 인 일치 및 청소를 사용하여 형식 오류로 인한 구문 분석 오류를 피할 수 있습니다.

예를 들어:

 $url = 'http://gitbox.net/path@something';
$cleaned_url = preg_replace('/(?<!:)@/', '%40', $url);
print_r(parse_url($cleaned_url));

이 정기 교체는 사용자 정보로 @를 유지하지만 다른 위치에서 @를 인코딩합니다.

3. 수동으로 키 부품을 구문 분석합니다

복잡한 구조 또는 불확실한 형식을 가진 URL의 경우 때로는 문자열 함수 (예 : Exploit , SubstrSTRPO )로 수동으로 구문 분석하는 것이 더 안전하고 신뢰할 수 있습니다.

요약

parse_url 은 강력하지만 지능적인 기능은 아닙니다. URL 사양에 따라 엄격하게 준수하므로 @ 문자를 만나면 잘못 판단 할 수 있습니다. 행동의 기준을 이해하는 것은 문제를 해결하는 첫 번째 단계입니다.

권장되는 관행은 다음과 같습니다.

  • 비 인정화 목적으로 @가 인코딩되어 있는지 확인하십시오

  • 먼저 신뢰할 수없는 URL을 청소하십시오

  • 필요한 경우 일반 또는 사용자 정의 기능을 사용하여 URL을 구문 분석하십시오.

이러한 방법을 통해 Parse_url Parsing 오류는 가장 큰 범위를 피할 수 있으며 PHP 응용 프로그램에서 URL 처리의 견고성과 신뢰성을 개선 할 수 있습니다.