在将电子邮件地址传递给is_mail()函数之前,我是否应该对其进行清理?

时间:2014-11-24 作者:henrywright

我正在使用is_email() 检查用户提供的电子邮件地址是否有效。例如:

$email = $_POST[\'email\'];
if ( is_email( $email ) )
    // Do something.
据我所知,此函数中没有任何内容将信息写入数据库。我应该消毒吗$email 在我将其传递给函数之前?

3 个回复
最合适的回答,由SO网友:Howdy_McGee 整理而成

查看is_email() trac上的功能,看起来您不需要sanatizie,因为这只是字符串测试。我甚至可以说,如果此函数返回true,则在将其发送到数据库之前,无需对其进行清理。

SO网友:kaiser

WordPress和PHP核心is_email() 功能Source是一个典型的WordPress实现,不能完全使用RFC 6531 允许。一个原因可能是,默认的PHPFILTER_VALIDATE_EMAIL 常数filter_var() 根据The Internet Engineering Task Force (IETF®) 指导方针

标准的要点是RFC 6531允许;超出ASCII范围的Unicode字符。即(对于本地部分-在@):

大写和小写英文字母(a–z,a–z)(ASCII:65–90,97–122)

        数字09 (ASCII:48–57)这些特殊字符:! # $ % & \' * + - / = ? ^ _ ` { | } ~
      • 字符. (点、句点、句号)(ASCII:46),前提是它不是第一个或最后一个字符,并且它不连续出现(例如。[email protected] 不允许)"(),:;<>@[\\] (ASCII:32、34、40、41、44、58、59、60、62、64、91–93)特殊字符的限制是,它们只能在引号之间使用,其中2个(反斜杠和引号);(ASCII:92、34)前面还必须加反斜杠\\ (例如。"\\\\""\\"").john.smith(comment)@example.com 和(comment)[email protected] 都相当于"[email protected]", 但是john.(comment)[email protected] 将无效U+007F, RFC 6531允许使用UTF-8编码,但邮件系统可能会限制在分配本地部分时使用哪些字符

        电子邮件地址的域名部分必须符合严格的准则:它必须符合主机名的要求,包括字母、数字、连字符和点。此外,域部分可以是IP地址文本,由方括号包围,例如jsmith@[192.168.2.1]jsmith@[IPv6:2001:db8::1] […]

        <支持>Source: Wikipedia

        什么是有效的

        这可能会导致出现以下奇怪但有效的电子邮件地址:

        • [email protected]
            • (comment)[email protected]
            • "this is v@lid!"@example.com
            • "much.more unusual"@example.com
            • postbox@com
            • admin@mailserver1
            • "()<>[]:,;\\\\@\\"\\\\\\\\!#$%&\\\'*+-/=?^_`{}| ~.a"@example.org
            • " "@example.org
            Source: php.net / 著者[email protected]–本文作者修复的示例

            限制也有本地和;域长度限制:

            电子邮件地址的格式为local-part@domain 其中local-part may be up to 64 characters long和domain name may have a maximum of 253 characters – 但是maximum of 256-character length 前向或反向路径限制整个电子邮件地址no more than 254 characters long.[2] RFC 5322(第3.2.3节和第3.4.1节)和RFC 5321中给出了正式定义,信息RFC 3696【3】和相关勘误表中给出了更具可读性的形式。

            来源:维基百科

            WordPress限制,这就是WordPress检查的内容:

            测试电子邮件的最小长度:strlen( $email ) < 3strpos( $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 )

            过滤器(&A);自定义验证将触发上述所有情况is_email() 返回false。结果是可过滤的(可以附加回调),过滤器将有三个参数,其中最后一个参数是原因。示例:

            return apply_filters( \'is_email\', false, $email, \'sub_hyphen_limits\' );
            
            这意味着您可以覆盖特定检查返回的结果。

            这允许您添加特殊检查,例如允许Umlaut域、仅TLD域部分等。

            结论WordPress在大多数情况下是安全的,但由于邮件服务器实际上必须符合RFC,因此限制更大。请记住,并非所有邮件服务器都符合RF 6531准则。

            编辑有趣的旁白:里面有两个相关的函数~/wp-includes/formatting: is_email()sanitize_email(). 他们实际上是the same 作用我不知道为什么有人认为最好将函数内容从一个复制到另一个,而不是将一个作为回调添加到另一个提供的过滤器中。像is_email() 自v0起。71和sanitize_email() 自v1起。5都是一样的,我个人会用后者来清洁绳子。请注意is_email() 甚至表示它不符合RFC。

SO网友:JesseM

清理所有东西!

安全的基本规则之一是永远不要相信用户的输入。一般来说,我不关心is\\u email()或任何其他特定函数的实现,也不关心该函数对我提供的内容是否有任何危险。也许有一天实施会改变。谁知道呢。我不得不假设这是可以妥协的。我们应该始终假设用户输入是主动敌对的,对于最终指定给数据库的任何内容都是如此,并且在将用户输入传递给某个函数之前对其进行清理。这是很好的一般安全卫生。

结束

相关推荐