PHP条件比较失效:阻止含@mail.ru的邮箱提交失败
解决邮箱拦截逻辑失效的问题
嘿,这个问题我一眼就看出来啦!你的拦截逻辑完全失效的核心原因,是if语句后面多了个多余的分号——这直接让PHP跳过了条件判断,不管邮箱是不是@mail.ru结尾,都会执行后面的代码块。
问题根源拆解
你原来的代码里写了这行:
if ($emailCheck !== '@mail.ru'); {
这里的分号;相当于告诉PHP:“这个if条件的执行体是空的”,后面的大括号{}就变成了一个独立的代码块,不管条件是否成立都会直接运行,这就是为什么你的拦截完全没起作用。
另外补充个小问题:用substr取最后8位的判断逻辑有漏洞——如果用户输入类似test@mail.ru.cn这种带额外后缀的邮箱,取最后8位会得到l.ru.cn,根本匹配不上@mail.ru,不如用更可靠的字符串匹配方法。
修正后的完整代码
PHP逻辑(修复分号+优化判断方式)
<?php $emailCheck = ''; if ($_SERVER["REQUEST_METHOD"] == "POST") { // 先确保邮箱字段存在且不为空 if (!empty($_POST['email'])) { $userEmail = trim($_POST['email']); $emailCheck = $userEmail; // 用于前端显示检查值 // 更可靠的判断:检查邮箱是否以@mail.ru结尾 // PHP 8.0+可用str_ends_with,低版本可以用substr_compare if (str_ends_with($userEmail, '@mail.ru')) { // 匹配到禁止的邮箱,拒绝提交 echo '<p style="color: red;">该邮箱地址不允许提交</p>'; } else { // 未匹配,执行正常提交逻辑 // Do something - only Insert if NOT match echo '<p style="color: green;">提交成功</p>'; } } else { echo '<p style="color: red;">请填写邮箱地址</p>'; } } ?>
对应的HTML代码(优化回显逻辑)
<form name="form1" method="post" action=""> <p> </p> <p><input name="email" type="text" id="email" value="<?php echo isset($emailCheck) ? htmlspecialchars($emailCheck) : ''; ?>"></p> <p> </p> <p> <input type="submit" name="submit" id="submit" value="Submit"> </p> <p>Email Check: <?php echo isset($emailCheck) ? htmlspecialchars($emailCheck) : ''; ?></p> </form>
额外的反爬小建议
- 蜜罐优化:把蜜罐字段用CSS彻底隐藏(比如
position: absolute; left: -9999px;),不要给任何视觉提示,爬虫往往会填充所有字段,而真实用户看不到不会填; - reCaptcha v3衔接:等部署完成后,可以结合分数判断——给分数极低的请求直接拦截,不用走邮箱检查;
- 频率限制:给同IP加简单的提交频率限制(比如1分钟内只能提交1次),对付批量提交的爬虫效果会更好。
内容的提问来源于stack exchange,提问作者Burndog
相关产品推荐
相关产品推荐

