Slack API file.upload上传CSV文件被强制错误追加.py后缀问题
问题描述
通过Slack机器人调用Slack API的file.upload接口上传.csv格式文件,已明确指定请求参数filetype=csv、文件扩展名为.csv,但接口返回结果显示Slack将上传文件识别为Python文件,强制追加.py扩展名,所有用户下载文件时,得到的都是实际为CSV格式、却带有.py扩展名的异常文件。
初步判断触发原因:Slack的文件类型检测逻辑识别到文件内容中的"""字符后,直接判定该文件为Python类文件,完全忽略请求方指定的文件类型参数,擅自修改文件扩展名。
复现步骤
- 测试文件为合法CSV文件,内容精简后如下:
/tmp/playground/slack_py_repro$ cat test_run_6588_errors_summary_by-action_report.csv HTTP Status-Code=504 (Gateway Time-out) for ""{URL}""" HTTP Status-Code=504 (Gateway Time-out) for ""{URL}"""
- 调用接口的curl命令及返回结果如下:
/tmp/playground/slack_py_repro$ curl -sLk -F file=@test_run_6588_errors_summary_by-action_report.csv -F "filename=test_run_6588_errors_summary_by-action_report.csv" -F "filetype=csv" -F "channels=${CHANNEL}" -H "Authorization: Bearer ${TOKEN}" https://slack.com/api/files.upload | jq { "ok": true, "file": { "id": "<HIDDEN>", "created": 1655497834, "timestamp": 1655497834, "name": "test_run_6588_errors_summary_by-action_report.csv.py", "title": "test run 6588 errors summary by-action report.csv", "mimetype": "text/plain", "filetype": "python", "pretty_type": "Python", "editable": true, "size": 110, "mode": "snippet", "is_external": false, "external_type": "", "is_public": false, /* ... */ } }
安全风险说明
该问题存在明确安全隐患:攻击者可上传伪装为.csv扩展名的恶意Python文件,Slack网页端会将其标识为CSV文件,但用户下载后文件会变为.csv.py格式,疏忽的用户可能误以为是电子表格打开,触发Python运行时执行恶意代码,导致设备、数据或内网受损。
问题解答
该问题不属于操作不当,是Slack文件上传接口的自动类型检测逻辑优先级高于用户传入参数导致的已知行为。
可以通过以下配置避免Slack擅自修改上传文件扩展名:
- 上传前将CSV内容调整为标准CSV转义格式,把内容中连续的三引号
"""替换为符合CSV规范的转义写法,从根源上避免触发Slack的Python文件特征匹配规则。标准CSV格式中,字段内的双引号需要用两个双引号做转义,调整后不会影响CSV文件的正常解析。 - 调用
file.upload接口时,额外显式传入snippet_type=csv参数,强制指定snippet模式下的文件类型,覆盖Slack的自动检测结果。 - 如果不需要使用Slack的在线文本预览、编辑功能,上传时设置
mode=file参数,替代默认的snippet模式。该模式下Slack不会对上传的文件做内容特征扫描和类型篡改,会完整保留请求中传入的文件名和后缀。
内容的提问来源于stack exchange,提问作者netikras
相关产品推荐
相关产品推荐

