什么解释Perl文件名检查?

Lar*_*ars 0 perl filenames sanitization

代码'if(-e"filename")'测试在包含该代码的脚本的目录中是否存在具有名称filename的文件.

怎么做名字检查?Perl的?操作系统?Bash on POSIX-os?

'if(-e"cat string")'会在Linux上执行cat命令吗?


我想知道为了能够避免不需要的文件访问,如"../file"将访问父目录中的文件.


要分享我的支票代码:

if($folder =~ m/$([\\]?\.[\\]?\.|[\\]?\\|[\\]?\/|[\\]?\?|[\\]?*|[\\]?:|[\\]?\||[\\]?\"|[\\]?\<|[\\]?\>)^|$([\\]?\.[\\]?\.|[\\]?\\|[\\]?\/|[\\]?\?|[\\]?*|[\\]?:|[\\]?\||[\\]?\"|[\\]?\<|[\\]?\>)\/|\/([\\]?\.[\\]?\.|[\\]?\\|[\\]?\/|[\\]?\?|[\\]?*|[\\]?:|[\\]?\||[\\]?\"|[\\]?\<|[\\]?\>)\/|\/([\\]?\.[\\]?\.|[\\]?\\|[\\]?\/|[\\]?\?|[\\]?*|[\\]?:|[\\]?\||[\\]?\"|[\\]?\<|[\\]?\>)^|\$'[^']*'/)
{
    #error
}
Run Code Online (Sandbox Code Playgroud)


更新正则表达式:

if($folder =~ m/(\/|\\)|$([\\]?\.[\\]?\.^|$[\\]?(\*|\?)^|\$'[^']*'/)
{
    #error
}
Run Code Online (Sandbox Code Playgroud)

说明:$ folder必须是纯文件名.如果它包含Windows或POSIX路径分隔符或是(任何转义的)父目录返回链接或是(任何转义)通配符(因为它匹配第一个匹配的文件并至少在Mac OS X上返回true)或包含C ANSI转义任何地方的序列,信号错误 其他任何东西,即使不合法或阴暗,也应该简单地返回"文件不存在",因此可以提供给'if(-e $文件夹)'.

Mor*_*kus 7

操作系统.Perl对-e(以及其他类似的-s)的调用是通过调用C库函数来实现的stat.

没有shell调用,因此"cat some_file"不会执行.相反,操作系统会查找名为"cat some_file"的文件.

stat当然,可以用相对路径名称来调用.如果你不想那样,那么除去文件名+扩展名之外的所有内容.有这种东西的Perl模块.

我不想调试/查看你提出的正则表达式,因为它确实是完全不可读和不可维护的.