PHP预约邮件功能正常但前端字符限制被绕过,如何防范恶意提交?
问题根因
前端的maxlength、输入限制等仅用于优化正常用户的交互体验,完全不具备安全防御能力。恶意用户可通过修改前端HTML代码、直接构造POST请求等方式轻松绕过,所有校验逻辑必须在后端补充实现。
修复方案
1. 补充后端字段校验逻辑
在iProcess处理页面获取参数后,先做合法性校验再走后续业务逻辑,参考代码如下:
if ($_SERVER["REQUEST_METHOD"] == "POST") { $notes = $_POST['notes'] ?? ''; $passenger = $_POST['passenger'] ?? ''; // 乘客人数字段校验:必须为正整数,长度不超过2位 if (!is_numeric($passenger) || strlen($passenger) > 2 || intval($passenger) < 1) { exit("乘客人数格式错误,最多支持99人"); } // 留言字段校验:长度不超过30字符 if (mb_strlen($notes, 'UTF-8') > 30) { // 可根据需求选择报错或自动截断:$notes = mb_substr($notes, 0, 30, 'UTF-8'); exit("留言内容最多支持30字符"); } // 原有转义逻辑保留 $notes = htmlentities($notes, ENT_QUOTES, 'UTF-8'); // 乘客数字段输出到HTML邮件也需要转义,避免XSS风险 $passenger = htmlentities($passenger, ENT_QUOTES, 'UTF-8'); // 后续原有邮件发送逻辑不变 }
同时修正前端代码里的textarea标签的maxlength属性,把现有值150改为30,对齐前后端限制规则。
2. 额外安全加固措施
- 增加CSRF令牌校验:表单页生成随机令牌存在Session中,提交时后端校验令牌一致性,拦截跨站伪造的提交请求
- 增加人机验证:提交前需要完成图形验证码、滑块验证等操作,拦截自动化批量提交的脚本
- 增加提交频率限制:同一IP/设备10分钟内最多提交3次预约,避免恶意刷接口
- 增加敏感词过滤:对留言内容匹配营销类敏感词,命中则直接拦截提交
安全软件选型
如果站点规模较小,完成上述代码修改后即可满足防护需求,无需额外安装安全软件。如果需要降低代码改造成本、同时防御SQL注入、XSS等其他常见Web攻击,可选择以下方案:
- 云厂商云WAF:主流云厂商都提供开箱即用的Web应用防火墙,配置规则后可自动拦截恶意提交、常见攻击请求
- 开源WAF:服务器部署ModSecurity,搭配通用防护规则,即可实现基础的恶意请求拦截能力
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

