清理或验证电子邮件 php


Sanitise or validate email php

我正在使用filter_var

以及检查电子邮件是否有效的功能

function checkEmail($email)
{
    return filter_var($email, FILTER_VALIDATE_EMAIL);
}

这是我唯一做的事情。例如,在注册中,我使用此函数验证电子邮件,然后插入数据库(使用ofc的准备好的语句)但是是否也必须在此功能中使用清理?是否有任何"有效"但"危险"的电子邮件可能会导致问题...?

FILTER_VALIDATE_EMAIL确保

电子邮件地址有效。它与从字符串中删除"危险"字符(即在某些上下文中具有特殊含义的字符)无关。

因此,输入验证很好,并且对于检查数据是否符合业务规则是必需的,但是当您将值注入另一个上下文时,它并不能免除转义特殊字符。

因此,放入HTML页面中的任何字符串都必须继续使用htmlspecialchars(),并且在MySQL查询中放入文本中的任何字符串都必须继续使用mysql_real_escape_string()(或者,更好的是,使用参数化查询,如mysqli或PDO,以避免必须将字符串停止到查询中)。生成内容时必须始终发生输出转义,无论您执行了什么输入验证。

是否有任何"有效"但"危险"的电子邮件可能会导致问题...?

当然。 a&a@b.com 在注入 HTML 时会中断; a%a@b.com注入 URL 组件时会中断; a'a@b.com注入到 SQL 字符串文本时会中断。上下文相关的输出转义至关重要;尝试删除所有在某些情况下可能很麻烦的字符意味着摆脱几乎所有标点符号,这并不好。

验证和卫生是两种不同的操作。

进行验证以确保用户输入采用所需的正确格式。同时进行清理以防止恶意用户损坏您的数据库/应用程序。

这两个操作通常是必需的。

如果您使用 MySQLi 或 PDO 的预准备语句,则可以跳过清理。

为了安全起见,我会在验证之前对其进行清理,因为如果电子邮件地址包含换行符,它也将通过验证,这可能会导致问题(安全公告)。

return filter_var(
         filter_var(
           $email,
           FILTER_SANITIZE_EMAIL
         ),
         FILTER_VALIDATE_EMAIL);

您还可以使用 trim() 删除尾随空格和换行符。

根据维基百科关于电子邮件地址的条目,邮件地址中允许使用几种特殊字符,例如 '% 。因此,您应该清理或使用准备好的语句。