在将电子邮件地址传递给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)数字0 到9 (ASCII:48–57)这些特殊字符:! # $ % & \' * + - / = ? ^ _ ` { | } ~字符. (点、句点、句号)(ASCII:46),前提是它不是第一个或最后一个字符,并且它不连续出现(例如。[email protected] 不允许)允许有限制的特殊字符。它们是:空间和"(),:;<>@[\\] (ASCII:32、34、40、41、44、58、59、60、62、64、91–93)特殊字符的限制是,它们只能在引号之间使用,其中2个(反斜杠和引号);(ASCII:92、34)前面还必须加反斜杠\\ (例如。"\\\\" 和"\\"").允许在局部零件的任一端使用括号进行注释;e、 g。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.compostbox@comadmin@mailserver1"()<>[]:,;\\\\@\\"\\\\\\\\!#$%&\\\'*+-/=?^_`{}| ~.a"@example.org" "@example.orgSource: 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 ) < 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过滤器(&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()或任何其他特定函数的实现,也不关心该函数对我提供的内容是否有任何危险。也许有一天实施会改变。谁知道呢。我不得不假设这是可以妥协的。我们应该始终假设用户输入是主动敌对的,对于最终指定给数据库的任何内容都是如此,并且在将用户输入传递给某个函数之前对其进行清理。这是很好的一般安全卫生。 结束 文章导航