Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:检查可执行文件_Python - Fatal编程技术网

Python:检查可执行文件

Python:检查可执行文件,python,Python,我遇到了这段代码,它工作得很好,但它是多余的吗 难道不exec=lambda x:os.access(x,os.x\u OK)就足够了吗 问题:是否存在这样一种情况,即Is\u exec=lambda x:os.access(x,os.x\u OK)未捕获,但第一个未捕获?两者都需要os.access(x,os.x\u OK)才能返回True。但是,除了在调用os.access之前执行一些不必要的测试外,第一个测试会使您面临shell注入攻击,除非您在使用x之前仔细筛选它的值。将shell=Tr

我遇到了这段代码,它工作得很好,但它是多余的吗

难道不
exec=lambda x:os.access(x,os.x\u OK)
就足够了吗


问题:是否存在这样一种情况,即
Is\u exec=lambda x:os.access(x,os.x\u OK)
未捕获,但第一个未捕获?

两者都需要
os.access(x,os.x\u OK)
才能返回True。但是,除了在调用
os.access
之前执行一些不必要的测试外,第一个测试会使您面临shell注入攻击,除非您在使用
x
之前仔细筛选它的值。将
shell=True
subprocess.call一起使用,只需将字符串传递给shell执行即可。如果仔细构造了
x
的值,那么最终执行的不仅仅是
type
命令。例如:

is_exec = lambda x: subprocess.call("type " + x, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) == 0 and (os.path.isfile(x) and os.access(x, os.X_OK))
x = "somefile.txt; rm foo.txt"
subprocess.call("type " + x, shell=True,
                stdout=subprocess.PIPE, stderr=subprocess.PIPE)

将字符串“typesomefile.txt;rm foo.txt”传递给shell,从而执行两个命令,而不仅仅是一个

这里有一个细微的区别——在第一个调用中,它还将检测shell内置,例如:

is_exec = lambda x: subprocess.call("type " + x, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) == 0 and (os.path.isfile(x) and os.access(x, os.X_OK))
x = "somefile.txt; rm foo.txt"
subprocess.call("type " + x, shell=True,
                stdout=subprocess.PIPE, stderr=subprocess.PIPE)
但是没有实际的
cd
可执行文件,因此无法使用
os.access()
明确检查它。也就是说,我认为应该是这样

$ type cd
cd is a shell builtin
$ echo $?
0
请注意,中间的运算符现在是
。此外,子过程管道在这里似乎有点多余,并且有一个警告,它可以被用作外壳注射来考虑。


总而言之,如果您只关心验证可执行文件,那么删除第一位就可以了。

我很确定这是多余的。两段代码都工作得很好;只有第二个更简洁。区别在于,一个实际执行测试,另一个检查属性。此外,无论如何都要避免第一个,因为它可能容易被任意代码执行。如果你不仔细检查
x
的值,第一个看起来像后门。