PHP Curl报URL含非法字符?排查输入数组隐形字符问题
报错根因
对着你贴的var_dump结果数字符长度,一眼就能看出问题:
- 正常文件名
150812.mp4本身长度就是10个字符(6位数字+.mp44个字符),你看到前4个数组元素长度是11,多出来的1个就是每行尾巴上粘的不可见\r。Windows系统下的textarea提交的换行是\r\n两个字符组成的,你现在只按\n切字符串,相当于把\r直接留在了每一行的末尾,这个字符不可见,打印也看不出来,但是拼到URL里就会直接触发非法字符报错。 - 最后一个数组元素长度是10,就是因为它是输入内容的最后一行,后面没有换行符,自然没带多余的
\r,和你的var_dump输出完全对得上。 - 哪怕把
\r清干净了,你现在直接把用户输入的文件名往URL查询参数里塞,但凡有个空格、特殊符号,照样报URL非法的错,这是写HTTP请求的基本规范问题。
落地修复步骤
1. 解决文本切分的隐形字符残留
不要直接用explode("\n", $_POST['comment'])切分输入,先统一处理所有换行相关的不可见字符,再生成数组:
// 读取原始提交内容 $raw_input = $_POST['comment']; // 统一把Windows换行、孤立回车替换为标准换行符 $raw_input = str_replace(["\r\n", "\r"], "\n", $raw_input); // 切分数组后,清理每一行首尾的不可见空白字符,同时过滤空行 $array_items = array_filter(array_map('trim', explode("\n", $raw_input)));
这段代码会自动清掉每一行首尾的回车符、空格、制表符等不可见字符,同时把输入里的空行直接过滤掉,避免无效循环。
2. 拼接URL时必须对参数做编码
只要往URL里拼接用户可控的输入内容,就必须用标准URL编码处理参数值,不然任何特殊字符都会触发URL非法报错:
把原来设置curl请求URL的代码:
curl_setopt($ch, CURLOPT_URL, "https://api.box.com/2.0/search?query=$file_name");
修改为:
// 对query参数做标准URL编码 $request_url = "https://api.box.com/2.0/search?query=" . urlencode($file_name); curl_setopt($ch, CURLOPT_URL, $request_url);
3. 增加匹配结果的兜底判断
避免搜索不到对应文件时,数组下标不存在触发的报错:
$arr = json_decode($result, true); // 没匹配到文件就跳过,不中断流程 if (empty($arr['entries'][0])) { echo "未查询到对应文件:{$file_name} <br>"; continue; } $file_id = $arr["entries"][0]["id"];
内容的提问来源于stack exchange,提问作者melk
相关产品推荐
相关产品推荐

