2010-08-04 6 views
9

filter_var 함수를 사용하여 전자 메일 주소의 유효성을 검사하기로 한 양식의 유효성 검사를 설정하는 중입니다. filter_var이 실제로 어디서나 허용하는 것을 알 수는 없지만 (문서가 매우 간단하기 때문에), test @ test와 같은 전자 메일 주소를 허용한다는 사실을 알게되었습니다. 도메인에 .com, .net 등이 있어야하지 않습니까?

+8

기술적으로 'test'는 로컬 네트워크의 유효한 호스트 이름 일 수 있으므로 올바른 것으로 가정합니다. –

+1

코드를 게시 할 수 있습니까? var_dump (filter_var ('test @ test.', FILTER_VALIDATE_EMAIL)); 은 나를 위해 false를 반환합니다! – Youssef

+1

도트가없는 test @ test도 false를 반환합니다. – Youssef

답변

18

동작이 4 월 중 일부 어딘가에 변경되었습니다. bug #49576revision 297350을 참조하십시오.

전자 메일이 실제로 유효하지 않거나 적어도 PHP 개발자가 이해 한 것입니다.

/* 
* The regex below is based on a regex by Michael Rushton. 
* However, it is not identical. I changed it to only consider routeable 
* addresses as valid. Michael's regex considers [email protected] a valid address 
* which conflicts with section 2.3.5 of RFC 5321 which states that: 
* 
* Only resolvable, fully-qualified domain names (FQDNs) are permitted 
* when domain names are used in SMTP. In other words, names that can 
* be resolved to MX RRs or address (i.e., A or AAAA) RRs (as discussed 
* in Section 5) are permitted, as are CNAME RRs whose targets can be 
* resolved, in turn, to MX or address RRs. Local nicknames or 
* unqualified names MUST NOT be used. 

changelog는 PHP 5.3.3과 PHP 5.2.14이 버그 수정을 언급 : 소스는이 통지서를 전달합니다.

+1

이 버그 티켓은 PHP5.3.3 및 PHP5.2.14로 수정되었습니다. – Gordon

+0

Great catch Artefacto. 그래서 나는 규칙이 바뀌 었다고 생각하니? 왜 이것이 바뀌 었습니까? 나는 그들이 filter_var 문서에서 무엇을 검사하는지 설명하기를 바란다. 5.3.3 이전에는 true가 반환되고 5.3.3 이후에는 false가 반환됩니까? 내가 사용하고있는 시스템은 5.2.12 – Metropolis

+0

입니다. @Metro 인터넷 표준을 준수하는지 이메일을 확인합니다. 이전에'test @ test'가 허락되었다는 사실은 버그였습니다. – Artefacto

5

유효한 이메일 주소입니다. 인터넷에서 작동하지는 않습니다 (적어도 오늘은 아니지만). 그러나 로컬 주소에는 적합합니다.

나는 개발자들이 전자 메일 주소를 확인하고 새 TLD가 도입되는 즉시 구식이 보장되는 시스템을 구축하지 않는 것이 합리적이라고 생각합니다. [email protected]을 거부하는 이메일 주소 구문 검사기가 충분합니다.

+1

RFC 5321의 섹션 2.3.5가 적용되지 않습니까? – Artefacto

1

아니요, test은 로컬/내부 네트워크 도메인 일 수 있습니다. 예를 들어 개발할 때 [email protected]을 올바르게 검증하는 것이 좋습니다.

보통 nonexistentdomain.foo에 동일한 문제가 있습니다. 호스트에 어떤 항목이 있는지 여부를 테스트하려면 getmxrr을 사용하십시오 (실패한 경우 gethostbyname()으로 폴백).

+0

로컬 주소를 허용하는 것이 가장 좋습니다. 또는 test @ test와 같은 것을 허용하고 싶지 않으면 getmxrr과 함께 사용해야합니까? – Metropolis

+0

checkdnsrr을 사용하여 확인하는 것이 좋을까요? 왜냐하면 서버가 다운되었거나 다른 것이 있으면 getmxrr은 false를 반환 할 것이기 때문입니다. 권리? – Metropolis

+1

로컬 주소 (대부분 알려진 IP 범위에 있음)를 원하면/허용 할 수 있습니다. MX 또는 A 레코드 (MX가 정의되지 않은 경우 폴백이어야 함)를 확인하더라도 실제로 checkdnsrr ('hostname', 'ANY')을 사용할 수는 있지만 나에게 발생하지 않았습니다. 등록 된 도메인 A & MX 레코드가 없어 전달할 수 없음). checkdnsrr/gethostbyname/getmxrr은 모두 afaik와 동일한 메커니즘을 사용하므로 DNS 서버가 다운되었거나 느린 경우 모든 옵션에서 실패하거나 느려집니다. – Wrikken

3

test @ test는 구문 적으로 유효합니다. RFC 5321에서

: 이메일 주소 자체에 의해 사용되는 최상위 도메인의 경우

는 단일 문자열은 어떤 점없이 사용됩니다. 오직이 후

그것은 말하는가 : 도메인 이름은 SMTP에서 사용하는 경우

만 분해, 정규화 된 도메인 이름 (FQDN에)이 를 허용됩니다. 다시 말해 이 MX RR 또는 주소 (즉, A 또는 AAAA) RR (섹션 5의 )에서 해결 될 수있는 이름이 허용되며 CNAME RR의 대상이 인 경우 MX로 확인됩니다. 또는 주소 RRs. 국지 별칭 또는 규정되지 않은 이름을 사용해서는 안됩니다.

이것은 반드시 TLD 전용 도메인 이름을 배제하지 않습니다. 사실, 다음 코드를 실행합니다 :

checkdnsrr('ua', 'MX') // Returns true

getmxrr('ua', $array) // Returns true

TLD 전용 도메인 이름 (수) MX 레코드를 가지고 이 사용 다음과 같습니다 http://www.to/은 예입니다.그리고 여기에 몇 가지 유효한 TLD 전용 도메인 이름 이메일 주소입니다 :

빈스 @가

폴 @ IO

루트 @ km

주스 @ 관리 @ 고작

TK

인공 지능

hostmaster @ ua

예제 소스 이메일 addre sses : Tony Finch – TLDs with MXs

관련 문제