我正在用Python制作一个Discord机器人。我在 shell 上安装了一些很酷的命令(如cowsay
),我想在机器人中实现这些命令,所以我在末尾有这段代码:
else:
for i in bash_cmds:
if digested.startswith(prefix + i):
cmd = digested.replace(prefix, '')
msg = os.popen(cmd).read()
msg = '```' + msg + '```'
await client.send_message(channel, msg)
所以基本上,如果它以!!
+ 我在数组中添加的任何 BASh 命令开头["cowsay", "cowthink", "fortune", "echo"]
,然后在 shell 中执行该命令。但是,这会带来一些安全问题。例如,可以写echo hackscript | bash
或nc -l 1337
或cat *
或rm *
(你明白了)。
我已经启动了一个我不想在命令中出现的命令列表。但是,我不希望出现错误来阻止看不到消息的成功部分。(如果有人放cowsay foo && ls
,我仍然希望显示cowsay foo
的输出。
如何过滤掉可能的恶意命令并允许邮件的未过滤部分成功?
我认为替换;
s 和&
s 之类的东西会起作用,但我想保留一些像$()
这样的东西可用,以便人们可以使用cowsay $(fortune)
,但是这样人们就可以做像echo $(ls)
这样的事情......但是我也不想过滤掉命令,因为: 一个。可能有办法绕过它, b.我不希望I eat 3 meals a day
变成I eat three mea a day
...
您可以使用受限制的 shell。然后,可以创建一个.bash_profile
,将$PATH
设置为仅包含机器人要执行的箱的目录。
听起来你想在参数上调用类似 https://docs.python.org/dev/library/shlex.html#shlex.quote 的东西