You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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>&nbsp;</p>
    <p><input name="email" type="text" id="email" value="<?php echo isset($emailCheck) ? htmlspecialchars($emailCheck) : ''; ?>"></p>
    <p>&nbsp;</p>
    <p>
        <input type="submit" name="submit" id="submit" value="Submit">
    </p>
    <p>Email Check: <?php echo isset($emailCheck) ? htmlspecialchars($emailCheck) : ''; ?></p>
</form>

额外的反爬小建议

  1. 蜜罐优化:把蜜罐字段用CSS彻底隐藏(比如position: absolute; left: -9999px;),不要给任何视觉提示,爬虫往往会填充所有字段,而真实用户看不到不会填;
  2. reCaptcha v3衔接:等部署完成后,可以结合分数判断——给分数极低的请求直接拦截,不用走邮箱检查;
  3. 频率限制:给同IP加简单的提交频率限制(比如1分钟内只能提交1次),对付批量提交的爬虫效果会更好。

内容的提问来源于stack exchange,提问作者Burndog

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:57:35