【发布时间】:2011-01-09 22:04:56
【问题描述】:
是否有与 mysql_real_escape_string() 等效的电子邮件注入?我有一个用户提交电子邮件的表单。我担心有人会插入以逗号分隔的电子邮件列表并使用我的网站发送垃圾邮件。
【问题讨论】:
-
通过 regular-expressions.info/email.html">this regex 推它。
标签: php
是否有与 mysql_real_escape_string() 等效的电子邮件注入?我有一个用户提交电子邮件的表单。我担心有人会插入以逗号分隔的电子邮件列表并使用我的网站发送垃圾邮件。
【问题讨论】:
标签: php
您可以使用filter_var 来验证电子邮件地址:
if (!filter_var($address, FILTER_VALIDATE_EMAIL)) {
// invalid e-mail address
}
【讨论】:
user-a@example.com,user-b@example.com 这样的字符串,它会返回false。
根据单个电子邮件地址的常用正则表达式验证字段
function validate_email($e){
return (bool)preg_match("`^[a-z0-9!#$%&'*+\/=?^_\`{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_\`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$`i", trim($e));
}
【讨论】:
对于那些使用旧版本的人
/*
# PHP Email Validation for versions LESS than PHP 5.2.0)
*/
$strEmail= mysql_real_escape_string($_POST['email_e']);
if (!eregi("^[_a-z0-9-]+(.[_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)*(.[a-z]{2,3})$", $strEmail)){
// valid email
} else {
// not a valid email
}
【讨论】:
如果您主要关心的是,如问题所述,验证用户没有试图通过输入逗号分隔的地址列表来欺骗您为他们发送垃圾邮件,那么简单地检查是否存在用户输入中有逗号吗?
【讨论】:
我发现好的电子邮件验证并不是那么简单,所以决定检查“@”和“.”。在字符串中。
function email_valid($email){
/* EMAIL VALIDATION, CHECKS IF STRING CONTAINS "@" and "." */
if( strpos($email, "@") AND strpos($email, ".") ){
return TRUE;
}
else {
return FALSE;
}
}
附:如果您不使用 PDO 准备语句写入数据库,请务必过滤掉可能导致 sql 注入的符号
【讨论】:
<input type="email" />。您关心的是用户是否可以收到您的电子邮件,即使使用有效的电子邮件地址也可能无法收到,因此发送确认电子邮件而不是编写验证码要简单得多。
检查总字符串长度会更简单 - 即本地部分最多 64 个 + @ + 域部分最多 255 个字符 = 320 个字符,但是仍然可以发送垃圾邮件短地址。我目前正在为我的项目研究电子邮件验证,发现这篇有趣的文章 email validation 深入解释了有效的电子邮件地址和 rfc2822。他们在那里提出了一种更简单的验证方法,可以防止逗号分隔的列表成为一种有效的垃圾邮件形式。
$isValid = true;
$atIndex = strrpos($email, "@");
if (is_bool($atIndex) && !$atIndex)
{
$isValid = false;
}
else
{
$domain = substr($email, $atIndex+1);
$local = substr($email, 0, $atIndex);
// ... work with domain and local parts
}
这只是通过找到最后一个 @ 符号来分解电子邮件地址,并声明在它之前传递的所有内容都是地址的本地部分,限制为 64 个字符。如果没有 @ 符号,则 strrpos 将返回一个布尔值 false。我将在我的验证功能中使用它。
【讨论】: