我正在使用filter_var
以及检查电子邮件是否有效的功能
function checkEmail($email)
{
return filter_var($email, FILTER_VALIDATE_EMAIL);
}
这是我唯一做的事情。在注册中,例如,我使用此功能验证电子邮件,然后插入数据库(使用ofc准备好的声明)但是在此功能中是否必须使用消毒?是否有“有效”但“危险”可能导致问题的电子邮件......?
答案 0 :(得分:5)
FILTER_VALIDATE_EMAIL
确保电子邮件地址有效。它与从字符串中删除“危险”字符(即在某些情况下具有特殊含义的字符)无关。
因此,输入验证一切都很好,并且对于检查数据是否符合业务规则是必要的,但是当您将值注入另一个上下文时,它并不能免除转义特殊字符的麻烦。
因此,您放入HTML页面的任何字符串,必须继续使用htmlspecialchars()
,以及您在MySQL查询中放入文字的任何字符串,您必须继续使用mysql_real_escape_string()
(或更好的是,使用mysqli或PDO中的参数化查询,以避免必须将字符串停止到查询中。无论您做了什么输入验证,在构建内容时都必须始终进行输出转义。
是否有任何“有效”但“危险”的电子邮件可能导致问题......?
当然可以。注入HTML时,a&a@b.com
会中断;注入URL组件时,a%a@b.com
会中断;注入SQL字符串文字时,a'a@b.com
会中断。依赖于上下文的输出转义至关重要;试图删除在某些上下文中可能会遇到麻烦的所有字符意味着要删除几乎所有标点符号,这实际上并不是很好。
答案 1 :(得分:1)
验证和卫生是两种不同的行为。
验证是为了确保用户输入的格式正确。虽然进行了卫生设施以防止恶意用户破坏您的数据库/应用程序。
通常需要这两种行为。
如果您使用MySQLi或PDO使用预准备语句,则可以跳过卫生设施。
答案 2 :(得分:0)
我会在验证之前对其进行清理,以确保安全,因为如果电子邮件地址包含换行符,它也会通过验证,这可能会导致问题(security bulletin)。
return filter_var(
filter_var(
$email,
FILTER_SANITIZE_EMAIL
),
FILTER_VALIDATE_EMAIL);
您还可以使用trim()
删除尾随空格和换行符。
答案 3 :(得分:0)
根据email addresses上的维基百科条目,'
和%
等邮件地址允许使用多个特殊字符。所以你应该消毒或使用准备好的陈述。