node.js - 在 Linux (Ubuntu) 服务器中保护 node.js exec 命令行
问题描述
将使用 Node.js 执行命令行的代码示例。它将返回页面的完整 HTML。
const getPageHtmlResponse = (fullUrl) => {//fullUrl is come from input form in web page
return new Promise((resolve, reject) => {
try {
const exec = require('child_process').exec
exec("curl "+fullUrl, (err, stdout, stderr) => resolve(stdout))
} catch (error) {
resolve(false)
}
});
}
这段代码可能不安全吗?我的意思是黑客可以在其上注入另一个命令来操纵系统或服务器?
如果是的话,有什么好方法可以逃脱它或使它安全吗?
解决方案
不要使用child_process.exec()
. 来自用户输入的巧妙制作的字符串将从您的程序中启动任意代码,这是您确实希望避免的。
相反,请child_process.execFile()
按如下方式使用:
const getPageHtmlResponse = (fullUrl) => {//fullUrl is come from input form in web page
return new Promise((resolve, reject) => {
try {
const execFile = require('child_process').execFile
execFile("/path/to/curl", fullUrl, (err, stdout, stderr) => resolve(stdout))
} catch (error) {
resolve(false)
}
});
}
execFile
采用预先解析的命令列表并且不启动中间外壳,因此通过不受信任的 URL 启动程序的风险较小。
也可以看看
推荐阅读
- javascript - 匹配自动完成字符串的任何部分,而不仅仅是第一个字母
- c - fgets 如何处理 \n?
- c - 在系统调用中使用 `\r` 字符进行 write(2)
- c# - 将对象动态转换为基本类型
- javascript - 使用 React 过滤对象列表
- javascript - Vue/Vuex:隐式传递对象给所有孩子
- mysql - WSO2 Identity Server 的新站,将用户存储更改为 MariaDB,缺少几个表
- javascript - 添加从异步函数一次返回一个的值
- java - 将二进制文件读取为字符串,编辑然后返回到 Android Studio (java) 中的二进制文件
- python - 使用 Selenium 在 python 中查找损坏的链接。未提供架构错误