上传中文文件名文件- Linux 存储并本地 shell 等处理文件-回显文件名列表-按原文件名下载文件 的需求中,最优雅的编解码方式是什么?

2023-09-15 09:38:42 +08:00
 matepi
需求:

Steps
1) 用户通过浏览器上传文件至 linux 服务器,需支持原文件名带中文文件名,列表回显至用户
2) 文件在 linux 服务器上存储后,自动触发,通过 shell 脚本作为入口,进行文件的处理
3) 用户可以再浏览器上,看到已处理完成的原文件名+".result.txt"的文件,进一步下载回用户本地

问题:

直接上传文件名至服务器端,可能因 linux 服务器本地编码不同等原因直接就中文->??了。在需支持各种服务器编码情况下,进行中文文件名的编码是必须的。

但,哪种编码为最优? BASE64 ? HTML entity ?或其他?

BASE64 应该可以在 http 下载 http head 中,被浏览器下载文件过程中直接解码;
而 HTML entity 可以在浏览器页面回显中,被浏览器页面渲染直接解码;
同时这两种编码是否在 linux shell 调用过程中有需要转义,又多一步转义编码?

但同时隐忧,解码尽量利用浏览器行为,是否会有浏览器不兼容性的隐忧,或许不如就老老实实手动编码?


目的:

寻求一个最优雅文件名编码形式,适应上传后、服务器端存储、服务器端 linux shell 处理、浏览器回显、浏览器下载等多种场景下,编解码最少、最优雅、同时一定程度上考虑浏览器兼容性的中文文件名编码转化方式。
1181 次点击
所在节点    程序员
24 条回复
mengzhuo
2023-09-18 14:17:04 +08:00
@matepi 我随便塞一个远程下载+反向 shell 怎么办?能上传任何逻辑就是死啊,回头你试试看公布一下地址,估计不超过 1 小时就被爆。
matepi
2023-09-18 14:20:57 +08:00
@mengzhuo 上传 shell 又不会被执行的……只会被 sed 处理、按 loader 工具按照预定的分割规则进行分隔符切割/定长分割处理后由工具入库,工具也不会用 SQL 引擎解析其中文字。读帖首先看题干看题干看题干…
mengzhuo
2023-09-18 16:45:11 +08:00
@matepi 不过滤么?这是想元编程来偷懒?我们之前搞手游的时候就出过这样的安全漏洞,直接搞挂整个业务(幸好是内部上传接口而已)。

就按你说的 sed+loader ,这个最简单的例子,一个带 header csv ,要 insert 每一行的话,不检验和过滤,分分钟教做人
```
item,count
id1,1
"; drop table user, 2
```

算了……好言难劝该死鬼,我坐等你来发挨攻击的帖子。
matepi
2023-09-18 16:54:07 +08:00
@mengzhuo

哎,数据库 loader 工具不是又依赖 insert 的…
不是我不懂 SQL 注入,而是你不知道哪些做法不会引起注入……

SQL 注入的优良解决方式不是依赖过滤的,而是依赖 SQL 执行侧上正确的变量绑定、包括我上面所说的使用数据库厂商的文本数据 loader 工具。这些是不会引起注入的。

过滤不是个完善的实现。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/973949

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX