前端首页必须通过 POST 请求调用后端 /api/sms/send 接口,携带手机号和场景参数,并附带图形验证码 token;后端需校验手机号格式、scene 白名单、频率限制及缓存验证码,禁用 GET 传参,确保安全可控。

ThinkPHP8 里怎么在前端首页触发短信发送
不能直接在前端 HTML 或 JS 里调用短信服务,这是安全底线。所有短信发送逻辑必须走后端接口,前端只负责发请求、传参数、收响应。
前端首页如何发起合法的短信发送请求
前端(比如 index.html 或 index.vue)只能通过 AJAX 调用你写好的 ThinkPHP8 接口,且该接口需明确限制来源、频率和参数校验。
- 接口地址建议设为
/api/sms/send,而非/index/index/sms这类控制器路径,更符合 REST 风格也方便中间件统一管控 - 必须使用 POST 方法,禁止 GET 传手机号(会泄露在日志和浏览器历史中)
- 前端需携带一次性验证码(如图形验证码或滑块验证后的 token),否则后端应直接拒绝
- 推荐用
fetch或axios发送,带Content-Type: application/json,传参格式如:{phone: "13800138000", scene: "register"}
后端接口怎么写才安全可用
在 ThinkPHP8 中,短信接口必须放在 app/api/controller/Sms.php 这类独立命名空间下,并启用中间件做风控。
- 必须启用
throttle中间件限制频次,例如:->middleware('throttle:5,1')(1 分钟最多 5 次) - 必须校验
phone格式(用正则^1[3-9]\d{9}$),并过滤空格、短横线等干扰字符 - 必须检查
scene是否在白名单内(如["login", "reset", "register"]),避免被滥用于任意场景 - 调用短信 SDK 前,要先生成 6 位随机码,存入缓存(
cache()->set("sms_{$phone}_{$scene}", $code, 300)),再发给运营商 - 不要在响应体里返回真实手机号,可返回
{"code": 0, "msg": "已发送至 138****8000"}
常见报错和绕不开的坑
实际部署时,90% 的失败不是代码问题,而是配置或权限卡住。
立即学习“PHP免费学习笔记(深入)”;
-
Class 'overtrue\easy-sms\EasySms' not found:没执行composer require overtrue/easy-sms,或未在控制器顶部use对应类 - 前端提示
403 Forbidden:多半是跨域中间件没配好,确认app/middleware.php中已启用think\middleware\AllowCrossDomain并允许POST和X-Requested-With - 短信发不出但无报错:检查
config/sms.php中的default驱动名是否和gateways下的键一致;阿里云需填access_key_id,腾讯云叫secret_id,别混用 - 本地能发、线上 500:服务器可能禁用了
cURL或没开 HTTPS 支持,用php -m | grep curl和openssl确认扩展已启用
短信服务本身不复杂,难的是把“谁能在什么时候、对谁、发什么”这三件事管住。漏掉任意一环,轻则被刷量,重则被运营商拉黑账号。



















