이메일 주소를 is_email () 함수로 전달하기 전에 이메일 주소를 삭제해야합니까?


13

is_email()사용자 제공 이메일 주소가 유효한지 확인하는 데 사용 하고 있습니다. 예를 들면 다음과 같습니다.

$email = $_POST['email'];
if ( is_email( $email ) )
    // Do something.

내가 아는 한,이 함수는 데이터베이스에 정보를 쓰지 않습니다. $email함수에 전달하기 전에 소독해야합니까 ?


카이저, 편집 해 주셔서 감사합니다. 그것은 실제로 나를 위해 소독이지만 나는 대부분의 독자들이 z 를 사용할 것이라고 확신합니다 :)
henrywright

답변:


5

is_email()trac 의 기능을 살펴보면 문자열 테스트 일뿐이므로 위생 처리 할 필요가없는 것처럼 보입니다. 이 함수가 true를 반환하면 데이터베이스로 보내기 전에 소독 할 필요가 없습니다.


문자열 테스트에 대한 나의 생각. 나는 db로 보내기 전에 여전히 위생 처리 할 것이라고 생각한다. 아마도 그것이 필요하지 않다는 것은 옳은 일이지만, 이런 일에 관해서는 긴장한 난파선이다. :)
henrywright

사실 미안보다 안전하고 위생적이며 소독 비용은 전혀 눈에 띄지 않습니다.
Howdy_McGee

18

워드 프레스 및 PHP 코어

is_email()기능 소스는 일반적인 워드 프레스 구현하고 무엇을 완전히 작동하지 않는 RFC 6531이 있습니다. 한 가지 이유는 IETF® (Internet Engineering Task Force) 지침 에 따라 기본 PHP FILTER_VALIDATE_EMAIL상수 filter_var()가 무언가를 검증하는 데 훨씬 좋지 않기 때문일 수 있습니다 .

표준

포인트는 것입니다 RFC 6531이 있습니다 "유니 코드 문자는 ASCII 범위를 초과" . 즉, 그것들은 (로컬 부분-앞에 @) :

  • 대문자 및 소문자 영문 (a–z, A–Z) (ASCII : 65–90, 97–122)
  • 숫자 09(ASCII : 48-57)
  • 이 특수 문자 : ! # $ % & ' * + - / = ? ^ _ ` { | } ~
  • 문자 .(점, 마침표, 마침표) (ASCII : 46)는 첫 문자 나 마지막 문자가 아니며 연속적으로 나타나지 않는 경우 (예 : John..Doe@example.com허용되지 않음)를 제공합니다.
  • 특수 문자는 제한이 허용됩니다. 그들은:
    • 우주와 "(),:;<>@[\](ASCII : 32, 34, 40, 41, 44, 58, 59, 60, 62, 64, 91–93)
    • 특수 문자에 대한 제한 사항은 따옴표 사이에 포함 된 경우에만 사용해야하며 그 중 2 개 (백 슬래시 \ 및 따옴표 "(ASCII : 92, 34))도 백 슬래시 앞에 와야합니다 \(예 : "\\""\""). .
  • 주석은 로컬 부분의 양쪽 끝에 괄호로 묶을 수 있습니다. 예를 들어 john.smith(comment)@example.com(comment)john.smith@example.com모두와 동일 "john.smith@example.com"하지만 john.(comment)smith@example.com유효하지 않습니다.
  • U+007F메일 시스템이 로컬 파트를 지정할 때 사용할 문자를 제한 할 수 있지만 위의 UTF-8로 인코딩 된 국제 문자 는 RFC 6531에서 허용됩니다.

전역 / 도메인 부분의 경우 :

이메일 주소의 도메인 이름 부분은 엄격한 지침을 준수해야합니다. 문자, 숫자, 하이픈 및 점으로 구성된 호스트 이름의 요구 사항과 일치해야합니다. 또한 도메인 부분은 jsmith@[192.168.2.1]또는 jsmith@[IPv6:2001:db8::1][…] 와 같이 대괄호로 둘러싸인 IP 주소 리터럴 일 수 있습니다 .

출처 : Wikipedia

유효합니까?

이로 인해 다음과 같이 이상하지만 유효한 전자 메일 주소가 생성 될 수 있습니다.

  • localpart.ending.with.dot.@example.com
  • (comment)localpart@example.com
  • "this is v@lid!"@example.com
  • "much.more unusual"@example.com
  • postbox@com
  • admin@mailserver1
  • "()<>[]:,;\\@\"\\\\!#$%&\'*+-/=?^_`{}| ~.a"@example.org
  • " "@example.org

출처 : php.net / author gt@kani.hu –이 글의 저자에 의해 수정 된 예

제한

로컬 및 도메인 길이 제한도 있습니다.

이메일 주소의 형식은 local-part@domain경우 로컬 부분은 64 자까지 될 수있다 긴과 도메인 이름이 253 자까지있을 수 있지만 - 256 자 길이의 최대 정방향 또는 역방향 경로가 전체 이메일 주소를 제한 수 없습니다 더 이상 254 자 . [2] 공식적인 정의는 RFC 5322에 (섹션 3.2.3와 3.4.1) 및 RFC 5321 - 정보 용 RFC 3696 [3]과 관련된 에라타에 주어진 더 읽을 수있는 형태로 .

출처 : Wikipedia

워드 프레스 제한

그리고 이것이 WordPress에서 확인하는 것입니다.

  • 이메일의 최소 길이를 테스트하십시오. strlen( $email ) < 3
  • 첫 번째 위치 다음에 @ 문자를 테스트하십시오. strpos( $email, '@', 1 ) === false
  • 유효하지 않은 문자를 테스트하십시오. !preg_match( '/^[a-zA-Z0-9!#$%&\'*+\/=?^_`{|}~\.-]+$/', $local )
  • 일련의 기간을 테스트하십시오. preg_match( '/\.{2,}/', $domain )
  • 선행 및 후행 및 공백 테스트 : trim( $domain, " \t\n\r\0\x0B." ) !== $domain
  • 적어도 두 개의 서브 우퍼를 할 도메인을 가정 $subs = explode( '.', $domain );다음과
    • 2 > count( $subs )
    • trim( $sub, " \t\n\r\0\x0B-" ) !== $sub
    • !preg_match('/^[a-z0-9-]+$/i', $sub )

출처 : WP Core v4.0

필터 및 맞춤형 검증

위에서 언급 한 모든 사례는 is_email()false를 반환하도록 트리거 합니다. 결과는 필터링이 가능하고 (콜백을 첨부 할 수 있음) 필터에는 세 개의 인수가 있으며 마지막 인수가 이유입니다. 예:

return apply_filters( 'is_email', false, $email, 'sub_hyphen_limits' );

이는 특정 검사에서 반환 된 결과를 무시할 수 있음을 의미합니다.

예를 들어 Umlaut 도메인, TLD 전용 도메인 부분 등을 허용하는 특수 검사를 추가 할 수 있습니다.

결론

WordPress는 대부분의 경우 안전하지만 메일 서버가 실제로 RFC를 준수해야하므로 더 제한적입니다. 모든 메일 서버가 RF 6531 지침을 준수하는 것은 아닙니다.

편집하다

재미는 sidefact : 두 개의 관련된 기능이 내부에 있습니다 ~/wp-includes/formatting: is_email()sanitize_email(). 그들은 실질적 으로 동일한 기능입니다. 나는 왜 누군가가 다른 것을 제공하는 필터에 콜백으로 하나를 추가하는 대신 함수 내용을 다른 곳으로 복사하는 것이 좋은 아이디어라고 생각했는지 전혀 모른다. 로 v0.71 이후1.5 버전 이후 동일 당신이 청소 문자열을 얻을, 나는 개인적으로 나중에를 사용합니다. 참고 이 RFC를 준수하지 않는 것으로도 상태.is_email() sanitize_email() is_email()


이론적으로 RFC 6531에 따라 완전히 유효한 전자 메일 주소가 있지만 WordPress에서는 유효하지 않은 것으로 간주됩니까?
henrywright

그렇습니다. 예를 들어 TLD 전용 도메인, 움라우트 도메인 등은 대답의 결론 전에 마지막 단락에서 읽을 수 있습니다. 답을 다시 읽으십시오. 나는 당신의 머리를 감싸는 것이 많은 것을 알고 있지만 그만한 가치가 있습니다.
카이저

1
나는 이것이 이해할만한 가치가 있기 때문에 실제로 이미 두 번 읽었습니다! :) 이러한 상세한 답변을 주셔서 감사합니다
henrywright

2

모든 것을 소독하십시오!

기본 보안 규칙 중 하나는 사용자의 입력을 절대 신뢰하지 않는 것입니다. 일반적으로, 나는 is_email () 또는 다른 특정 함수의 구현에 신경 쓰지 않습니다. 어쩌면 구현이 언젠가 변경 될 수 있습니다. 누가 알아. 나는 그것이 타협 될 수 있다고 가정해야합니다. 가정은해야한다 항상 사용자 입력이 결국 데이터베이스 향하는 아무것도 이중 때문에, 적극적으로 적대적이라고 할 수 있으며, 일부 기능에 나눠을 해제하기 전에 사용자 입력의 모든 비트를 살균 할 수 있습니다. 이것은 일반적인 보안 위생입니다.


구현이 변경되는지 알 수 없다고 말했을 때 머리에 못을 박았다고 생각합니다. 지금 소독하지 않는 것이 좋을지 모르지만 나중에 변경 될지 누가 알 수 있습니까?
henrywright
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.