linux - 有没有办法“逃避”linux命令?
问题描述
我正在制作一项服务,允许用户将文件发布到我的网络服务器,然后将该文件(经过几次检查)复制到图像服务器。我的网络服务器和我的图像服务器之间的主要通信方式是 scp。但是,我也想维护用户文件名,所以它看起来像这样:
- 用户将他们的文件发布到 Web 服务器
- Web 服务器检查文件是否受支持
- Web 服务器检查文件是否在文件大小限制之下
- Web 服务器说 OK 并尝试发送到图像服务器
- Web 服务器运行 ("scp" + 文件路径 + "root@imageServer:~/images")
- 图像服务器接收文件并准备根据请求将文件发送给用户(该文件夹是公共的,将由 nginx 提供服务)
这里的危险部分是 scp 命令。我不是安全方面的专家,但有没有办法让这个命令被劫持,就像数据库可以获得 SQL 注入一样?如果有人将他们的文件命名为恶意文件怎么办。有没有办法安全地将文件名加入脚本?安全地“逃避”命令?
我正在为 Web 服务器使用 express (node.js)。是否有另一种方法可以将文件从 Web 服务器发送到简单的 Ubuntu 安装,而无需使用 unix 命令或为图像服务器编写 REST api?有没有,那我可能根本不需要“逃”
顺便说一句,我选择将图像服务器和 Web 服务器分开的原因是因为我想在未来扩展应用程序。例如,如果有 10 个 Web 服务器并且没有中央图像服务器,那么如果文件不在您请求的 Web 服务器上,则无法检索文件。
解决方案
您可以使用child_process.spawn(或 中的其他方法)在没有 shell 的情况下运行外部命令(因此没有 shell 元字符的问题child_process
)。(显然,您不能将shell
选项指定为 default 以外的任何内容false
。)
这让您不必担心文件路径中的元字符,但在我看来,让用户提供要在实时文件系统上使用的文件路径名称还有很多其他问题。就个人而言,我会自动生成安全的短名称,并将用户名与文件系统名称的对应关系保存在某个数据库中。
推荐阅读
- sql - 如何交替显示两个表中的数据
- wordpress - Wordpress on IIS - Plugins were successfully installed but they don't show
- django - How to run wsgi along the side of the daphne ASGI for django channels
- gpflow - 为什么 HMC 采样器会为需要为正的超参数返回负值?[1.0 之前的旧 GPflow 版本]
- xamarin.forms - Xamarin 表单设计在 iphone 5s 中看起来被压缩了
- regex - 正则表达式仅提取 url 的域和子域
- java - 单元测试失败:java.lang.RuntimeException:android.os.Looper 中的方法 getMainLooper 未模拟
- php - 使用数据库中的信息即时创建子域
- java - 如何过滤数据存储属性是否存在于列表中
- android - 如何禁用导航栏和状态栏的按钮?