2

我在用filter_var

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

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

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

4

4 回答 4

5

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 字符串文字时会中断。依赖于上下文的输出转义是至关重要的;试图删除在某些情况下可能会造成麻烦的所有字符将意味着删除几乎所有的标点符号,这并不是很好。

于 2012-06-02T16:51:43.953 回答
1

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

进行验证以确保用户输入的格式正确。虽然卫生是为了防止恶意用户损坏您的数据库/应用程序。

通常需要这两种操作。

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

于 2012-06-02T16:47:50.780 回答
0

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

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

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

于 2012-06-02T16:45:38.443 回答
0

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

于 2012-06-02T16:48:41.730 回答