You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GS生成PNG后通过PHP即时删除是否安全?及问题排查

PDF转PNG即时清理方案的问题排查与优化建议

最新进展(编辑2)

已将GS命令迁移至图片PHP脚本中,文件在脚本内生成后即被删除,不会遗留至服务器磁盘。此前问题在于爬虫会读取主文件但不调用图片脚本,导致图片文件未被删除。将GS命令放入图片脚本后可正常运行,只需向脚本传递文件名和页码即可。


原始实现思路

最初通过以下GS命令将PDF转换为PNG图片:

gs -dNOPAUSE -dBATCH -r600 -dDownScaleFactor=3 -dFirstPage=11 -dLastPage=11 -sDEVICE=png16m -sOutputFile="xyzzy.png" myPDF.pdf

随后在页面中展示图片,并通过0尺寸的隐形图片标签调用删除脚本:

<img src='xyzzy.png'>
<img src="delete_img.php" width="0" height="0" border="0" alt="">

初始的delete_img.php代码:

<?php
header('Content-type:image/png');
include("php8sucks.php");
$key = get_num('n');
$file = 'xyzzy' . $key . '.png';
readfile($file);
usleep(100000);
unlink($file);
exit;
?>

修改后的代码与删除失效问题

后续改用10位随机数定义文件名避免冲突,但出现图片正常显示但文件未被删除的情况。修改后的delete_img.php:

<?php
header('Content-type:image/png');
include("php8sucks.php");
$file = get_num('n');
$file2 = 'xyzzy' . $file . '.png';
readfile($file2);
unlink($file2);
exit;
?>

php8sucks.php中的get_num函数:

function get_num($num){
    if(isset($_GET[$num])){
        $s = val_num($_GET[$num]);
    }   
    else $s = 0;
    return $s;
}

一、方案安全性分析

  • 硬编码文件名阶段风险极高:若未严格校验输入参数,易被构造恶意参数触发目录遍历攻击(如传入../config.php),后续计划采用filennnn.png格式(nnnn为随机数)并校验参数是正确的随机数字,这是正确的安全方向。需确保val_num函数严格限制输入为10位数字,过滤任何非数字字符。
  • 隐形img标签触发方式:本身无安全问题,但需注意浏览器可能因资源策略忽略该标签,导致删除脚本未被调用。

二、删除失效的核心排查点

  1. 时序问题:修改后的代码移除了延迟,readfile后立刻执行unlink,可能浏览器尚未完成文件读取就被删除。建议恢复延迟(推荐sleep(5)而非usleep(100000),0.1秒的延迟不足以应对大文件加载),或通过readfile的返回值确认读取完成后再执行删除。
  2. 权限问题:检查PHP运行用户是否拥有目标文件的删除权限,生成文件时的用户组与PHP进程用户组是否一致,文件权限是否设置为可写可删除。
  3. 参数传递验证:在delete_img.php中添加日志记录(如error_log($file2)),确认获取到的文件名与生成的随机文件名完全匹配,排查get_num函数是否正确解析参数。
  4. 浏览器资源加载策略:部分浏览器可能忽略0尺寸图片资源,导致删除脚本未被触发。可改用页面卸载事件的navigator.sendBeacon发送删除请求,该方式更可靠,不会因页面关闭被中断。

三、潜在故障点

  • 爬虫/机器人行为:虽已将GS命令移至图片脚本,但需测试爬虫仅请求图片脚本时,文件是否能正常生成并删除。
  • 并发请求冲突:多个delete_img.php实例同时运行时,只要文件名唯一就不会冲突,但需确保文件生成与删除的原子性(当前脚本内生成后立即删除,无此问题)。
  • 服务器资源瓶颈:高分辨率PDF转PNG会占用大量CPU与磁盘IO,可能导致删除操作延迟或失败,需监控服务器负载情况。
  • 浏览器兼容性:需测试Safari、Edge、旧版IE等浏览器,确认隐形img标签或替代触发方式能正常调用删除脚本。

四、安全延迟时长建议

  • 延迟时长需结合文件大小与用户网络速度设置,5-30秒是合理范围。测试5秒和60秒有效,但过长的延迟会增加磁盘占用风险,过短则可能导致文件未加载完成就被删除。
  • 避免使用usleep阻塞PHP进程,建议用sleep()或异步任务队列处理删除逻辑,减少资源占用。

五、替代方案:定时任务兜底

若即时清理方案不稳定,定时任务(cron job)是更可靠的兜底方案:

  • 命名文件时添加时间戳(如file_{随机数}_{时间戳}.png),设置cron每分钟清理一次超过1小时的临时文件。
  • 即使存在删除遗漏,也能避免磁盘被大量临时文件占满。

六、需额外测试的场景

  • 弱网络环境:模拟用户网络缓慢,验证文件加载完成后再被删除。
  • 并发请求:同时发起多个PDF转PNG请求,测试多实例删除脚本的稳定性。
  • 页面异常操作:在图片加载过程中关闭页面或刷新,确认文件仍能被删除。
  • 爬虫模拟:用爬虫工具仅请求图片脚本,验证文件生成与删除流程正常。

内容的提问来源于stack exchange,提问作者Allen Edwards

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 17:22:51