CodeIgniter3集成hCaptcha提交报SameSite属性未指定错误如何解决
问题根源
你之前给curl请求加SameSite头的操作完全改错了位置,报错来自两个层面:
- CodeIgniter 3默认配置没有给自身下发的Cookie(包括Session Cookie、业务自定义Cookie)添加SameSite属性,现代浏览器检测到跨站请求中携带无该属性的Cookie时,就会抛出对应提示
- 你调用hCaptcha验证接口的curl请求默认会自动携带本地存储的Cookie,向hCaptcha域名发起跨站请求时携带了未标记SameSite的Cookie,直接触发了警告
解决步骤
按顺序修改以下配置即可:
1. 修改CI全局Cookie配置
打开application/config/config.php,找到Cookie配置区块,补充/修改以下参数:
// 站点为HTTPS环境时设为TRUE,HTTP环境设为FALSE(注意SameSite=None必须搭配Secure=true使用,生产环境建议全站HTTPS) $config['cookie_secure'] = TRUE; $config['cookie_httponly'] = TRUE; // 新增SameSite配置 $config['cookie_samesite'] = 'None';
2. 修改CI Session Cookie配置
同一个config.php文件中找到Session配置区块,补充以下参数:
$config['sess_secure'] = TRUE; $config['sess_httponly'] = TRUE; $config['sess_samesite'] = 'None';
3. 低版本CI/PHP兼容处理
如果你的CI版本低于3.1.11、或者PHP版本低于7.3,框架原生不支持直接读取SameSite配置项,打开站点根目录的入口文件index.php,在加载CI核心代码之前加入以下兼容代码:
// 全局配置Session Cookie的SameSite属性 if (PHP_VERSION_ID >= 70300) { session_set_cookie_params([ 'lifetime' => 0, 'path' => '/', 'domain' => $_SERVER['HTTP_HOST'], 'secure' => isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on', 'httponly' => true, 'samesite' => 'None' ]); } else { ini_set('session.cookie_samesite', 'None'); ini_set('session.cookie_secure', isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? 'On' : 'Off'); }
4. 优化hCaptcha验证的curl逻辑
hCaptcha的siteverify是服务端到服务端的接口,不需要携带任何用户Cookie,在你的curl配置中加一行参数,禁止curl自动携带本地无关Cookie:
// 在curl_setopt区块新增这行 curl_setopt($ch, CURLOPT_COOKIEFILE, "");
修改后完整的curl逻辑片段如下:
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://hcaptcha.com/siteverify"); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 禁止自动携带无关Cookie curl_setopt($ch, CURLOPT_COOKIEFILE, ""); $response = curl_exec($ch);
注意事项
- 如果你站点不存在跨站提交表单的场景,可以把SameSite属性值设为
Lax,安全性比None更高,不需要强制开启Secure属性(但HTTPS环境还是建议开启Secure) - 所有修改完成后,清空浏览器中你站点的所有本地Cookie,重启浏览器再提交表单测试,SameSite属性警告会消失,hCaptcha验证流程可以正常运行
内容的提问来源于stack exchange,提问作者Amben Uchiha
相关产品推荐
相关产品推荐

