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은 그 후 호스트 이름입니다.
URL의 @가 사용자의 인증 정보의 일부가되어서는 안된다는 것을 알고 있으면 %40 으로 인코딩 할 수 있습니다. 예를 들어:
$url = 'http://gitbox.net/path%40something';
print_r(parse_url($url));
출력은 다음과 같습니다.
Array
(
[scheme] => http
[host] => gitbox.net
[path] => /path@something
)
이것은 @ 의 의미를 잘못 판단하는 parse_url을 피할 수 있습니다.
URL 소스 (예 : 사용자 입력 또는 타사 데이터)를 제어 할 수없는 경우 Parse_URL을 호출하기 전에 정기적 인 일치 및 청소를 사용하여 형식 오류로 인한 구문 분석 오류를 피할 수 있습니다.
예를 들어:
$url = 'http://gitbox.net/path@something';
$cleaned_url = preg_replace('/(?<!:)@/', '%40', $url);
print_r(parse_url($cleaned_url));
이 정기 교체는 사용자 정보로 @를 유지하지만 다른 위치에서 @를 인코딩합니다.
복잡한 구조 또는 불확실한 형식을 가진 URL의 경우 때로는 문자열 함수 (예 : Exploit , Substr 및 STRPO )로 수동으로 구문 분석하는 것이 더 안전하고 신뢰할 수 있습니다.
parse_url 은 강력하지만 지능적인 기능은 아닙니다. URL 사양에 따라 엄격하게 준수하므로 @ 문자를 만나면 잘못 판단 할 수 있습니다. 행동의 기준을 이해하는 것은 문제를 해결하는 첫 번째 단계입니다.
권장되는 관행은 다음과 같습니다.
비 인정화 목적으로 @가 인코딩되어 있는지 확인하십시오
먼저 신뢰할 수없는 URL을 청소하십시오
필요한 경우 일반 또는 사용자 정의 기능을 사용하여 URL을 구문 분석하십시오.
이러한 방법을 통해 Parse_url Parsing 오류는 가장 큰 범위를 피할 수 있으며 PHP 응용 프로그램에서 URL 처리의 견고성과 신뢰성을 개선 할 수 있습니다.