
本文介绍在 PHP 后端安全校验邮箱域名的方法,重点实现仅允许以 @gmail.com 结尾的邮箱地址通过验证,并集成到 DotMailsGenerator 工具中,避免前端 pattern 属性被绕过。
本文介绍在 php 后端安全校验邮箱域名的方法,重点实现仅允许以 `@gmail.com` 结尾的邮箱地址通过验证,并集成到 dotmailsgenerator 工具中,避免前端 pattern 属性被绕过。
在开发类似 DotMailsGenerator 这样的 Gmail 点号变体生成工具时,仅依赖前端 HTML 的 pattern 属性(如 <input type="email" pattern="^[a-zA-Z0-9]+@gmail\.com$">)是不安全的——用户可轻易禁用 JavaScript、修改表单或直接发送 POST 请求绕过校验。因此,必须在 PHP 服务端进行严格、可靠的域名后缀验证。
以下是三种推荐的 PHP 后端验证方式,按兼容性与可读性排序:
✅ 推荐方案:PHP 8.0+ 使用 str_ends_with()(最简洁、语义清晰)
function isGmail(string $email): bool {
return str_ends_with($email, '@gmail.com');
}
✅ 兼容方案:正则匹配(支持所有 PHP 版本)
function isGmail(string $email): bool {
return (bool) preg_match('/@gmail\.com$/i', $email);
}
? 注:
/i标志支持大小写不敏感(如@GMAIL.COM),\.com中的反斜杠确保点号被当作字面量而非正则元字符。
✅ 高效方案:strpos() + 负偏移(无正则开销,性能最优)
function isGmail(string $email): bool {
$suffix = '@gmail.com';
$pos = strpos($email, $suffix, -strlen($suffix));
return $pos !== false && $pos === strlen($email) - strlen($suffix);
}
⚠️ 注意:仅用
strpos($email, $suffix, -strlen($suffix)) !== false不够严谨(例如test@gmail.com.xyz也会匹配),因此需额外校验位置是否恰好位于末尾。
✅ 集成到你的主逻辑中(关键修改)
将以下校验逻辑插入你原有 PHP 脚本的 if(isset($_POST['email'])) 块顶部:
<?php set_time_limit(0);
// ✅ 新增:强制 Gmail 域名校验
function isGmail(string $email): bool {
return str_ends_with($email, '@gmail.com');
}
if (isset($_POST['email'])) {
$rawEmail = trim($_POST['email'] ?? '');
// ❌ 拒绝空、无效或非 Gmail 邮箱
if (empty($rawEmail) || !isGmail($rawEmail)) {
http_response_code(400);
echo '<div class="box"><div class="title">Error</div><textarea type="text">Invalid email: must end with @gmail.com</textarea>';
exit;
}
// ✅ 安全提取用户名和域名(已确保 domain === '@gmail.com')
[$localPart, $domain] = explode('@', $rawEmail, 2);
$localPart = stripslashes(trim($localPart));
$domain = '@' . trim($domain); // 保持 '@gmail.com'
// ✅ 清理 & 转义(防止 XSS,尤其输出到 textarea)
$localPart = htmlspecialchars($localPart, ENT_QUOTES, 'UTF-8');
$res = addDOT($localPart);
echo '<div class="box">
<div class="title">Total: ' . count($res) . '</div>
<textarea type="text">';
foreach ($res as $variant) {
echo $variant . $domain . PHP_EOL;
}
echo '</textarea>
</div>';
}
function addDOT(string $str): array {
if (strlen($str) > 1) {
$ca = preg_split('//u', $str, -1, PREG_SPLIT_NO_EMPTY); // 支持 UTF-8 字符
array_shift($ca);
array_pop($ca);
$head = array_shift($ca);
$res = addDOT(implode('', $ca));
$result = [];
foreach ($res as $val) {
$result[] = $head . $val;
$result[] = $head . '.' . $val;
}
return $result;
}
return [$str];
}
?>
? 重要注意事项
-
永远不要信任客户端输入:HTML
pattern、JavaScript 校验仅作用户体验优化,不可替代服务端验证。 -
邮箱格式 ≠ 邮箱有效性:本文仅校验后缀,不验证邮箱是否真实存在或语法合规(如含多个
@)。如需更严格校验,可补充filter_var($email, FILTER_VALIDATE_EMAIL)。 -
安全性增强建议:
- 对
$localPart执行htmlspecialchars()再输出,防止 XSS(因内容直接写入<textarea></textarea>); - 使用
explode('@', $email, 2)限定分割次数,避免user@gmail.com@example.com类畸形输入; - 添加速率限制或验证码,防止滥用生成接口。
- 对
通过以上改造,你的工具将真正实现「仅支持 Gmail」的安全策略,兼顾健壮性、可维护性与现代 PHP 最佳实践。











