以root身份运行PHP curl脚本后Cookie文件权限被重置问题
问题原因
curl 8.x版本新增了root身份运行时的cookie文件安全限制:当进程以root权限写入cookie文件时,会强制将文件权限设置为600(仅所有者可读可写),同时将文件属主属组改为运行进程的用户(即root)。而curl 7.29版本没有这个强制安全校验逻辑,所以不会修改原有文件权限和属主。
解决方案
1. 优先推荐:避免用root身份运行脚本
以www用户运行PHP脚本是更安全的操作,既符合Web服务的权限规范,也不会触发curl的这个安全限制,完全规避问题。
2. 若必须以root运行,手动恢复文件权限和属主
如果业务场景确实需要root权限运行脚本,可以在curl执行前后手动保存并恢复cookie文件的权限、属主信息:
<?php $url = 'https://stackoverflow.com/questions/ask'; $file = '/home/www/.cookies2.txt'; // 保存原文件的权限、属主、属组信息 $stat = stat($file); $originalPerms = $stat['mode'] & 0777; // 获取文件权限位 $originalOwner = $stat['uid']; $originalGroup = $stat['gid']; // 执行curl请求 $ch = curl_init($url); curl_setopt($ch, CURLOPT_COOKIEFILE, $file); curl_setopt($ch, CURLOPT_COOKIEJAR, $file); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $return = curl_exec($ch); curl_close($ch); // 恢复原文件权限和属主属组 chmod($file, $originalPerms); chown($file, $originalOwner); chgrp($file, $originalGroup);
3. 不推荐:修改curl编译配置(降低安全性)
如果一定要让curl保留原有文件权限,可以在编译curl时禁用cookie安全限制。编译时添加编译选项:
./configure --disable-cookie-security
但此操作会降低cookie文件的安全性,不建议在生产环境使用。
内容的提问来源于stack exchange,提问作者M-A-X
相关产品推荐
相关产品推荐

