在 CentOS(以及所有类 Unix 系统)中,反引号(`)本身并不会“防注入”,它只是 命令替换(command substitution) 的语法:
result=`command`
是否会被“注入”,取决于 你怎么使用反引号里的命令、变量和用户输入。
下面分场景说明。
user_input="; rm -rf /"
result=`echo $user_input`
或更危险:
result=`eval $user_input`
⚠️ 反引号会执行里面的命令,用户输入如果未过滤,就可能执行任意命令。
❌ 错误
out=`$user_cmd`
✅ 正确
out=`ls`
name="test file"
out=`echo "$name"`
⚠️ 注意:
双引号不能防止命令注入,只能防止空格/特殊字符问题。
$(...) 替代反引号(更易读、更安全)out=$(command)
功能一样,但:
eval 用户输入❌
eval "$user_input"
✅ 如果一定要执行,先白名单校验:
case "$cmd" in
start|stop|restart)
$cmd
;;
*)
echo "invalid command"
;;
esac
如果是:
✅ 使用:
示例(Python):
subprocess.run(["ls", user_input])
❌ 不要:
os.system("ls " + user_input)
| 做法 | 是否安全 |
|---|---|
echo \$var`` |
❌ 有风险 |
$(command) |
✅ 推荐 |
eval $input |
❌ 极度危险 |
| 白名单命令 | ✅ 最安全 |
| 输入校验 | ✅ 必须 |
反引号不防注入,防注入靠“不执行用户输入 + 参数化 + 白名单”。
如果你能贴出具体代码或场景(Shell / PHP / Python / Web),我可以直接帮你改成安全写法。