我正在寻找一种方法来使用raw_input()提示来执行另一个对象的代码,以确保我以安全的方式执行此操作。
我有两个班,第一个有一个我不应该打电话的方法,既不是来自外部,也不是来自内部;第二个有一个方法来解析用这种方式构建的用户请求:“方法调用arg1 arg2 ......”。 例如:“add 5 3”。并且应该使用5和3作为参数调用方法“do_add”。
class Obj1 :
# ...
def do_forbidden(self) :
# Not supposed to execute
# ...
class Obj2 :
# ...
def process_cmd(self, cmd) :
words = cmd.split()
if len(words) > 0 :
mthdname = 'do_' + words[ 0 ]
args = words[1:]
if hasattr(self, mthdname):
mthd = getattr(self, mthdname)
mthd(*args)
# ...
然后:
obj1 = Obj1()
obj2 = Obj2()
# ...
cmd = raw_input("Command : ")
obj2.process_cmd(cmd)
在这里,有没有办法输入可以从obj1执行“do_forbidden()”的东西? input()而不是raw_input()是否有所作为?
如果攻击实际上是可行的,攻击者可以“猜测”其中一个方法的名称来执行它,那么前缀'do_'是一个很好的保护吗?
答案 0 :(得分:2)
无法利用这一点。除非其中一个do_
方法有其他漏洞。您无法执行未在process_cmd
调用的同一对象上定义的方法。
input
将是一个完全不同的东西,你执行任何你想要的东西。