【发布时间】:2012-10-19 11:59:15
【问题描述】:
代码 'if(-e "filename")' 测试在执行包含该代码的脚本的目录中是否存在名为 filename 的文件。
什么是名称检查?珀尔?操作系统? Bash on POSIX-os?
'if(-e "cat string")' 会在 Linux 上执行 cat 命令吗?
我想知道为了能够避免像“../file”这样不需要的文件访问会访问父目录中的文件。
分享我的校验码:
if($folder =~ m/$([\\]?\.[\\]?\.|[\\]?\\|[\\]?\/|[\\]?\?|[\\]?*|[\\]?:|[\\]?\||[\\]?\"|[\\]?\<|[\\]?\>)^|$([\\]?\.[\\]?\.|[\\]?\\|[\\]?\/|[\\]?\?|[\\]?*|[\\]?:|[\\]?\||[\\]?\"|[\\]?\<|[\\]?\>)\/|\/([\\]?\.[\\]?\.|[\\]?\\|[\\]?\/|[\\]?\?|[\\]?*|[\\]?:|[\\]?\||[\\]?\"|[\\]?\<|[\\]?\>)\/|\/([\\]?\.[\\]?\.|[\\]?\\|[\\]?\/|[\\]?\?|[\\]?*|[\\]?:|[\\]?\||[\\]?\"|[\\]?\<|[\\]?\>)^|\$'[^']*'/)
{
#error
}
更新正则表达式:
if($folder =~ m/(\/|\\)|$([\\]?\.[\\]?\.^|$[\\]?(\*|\?)^|\$'[^']*'/)
{
#error
}
解释:$folder 应该已经是一个纯文件名了。如果它包含 Windows 或 POSIX 路径分隔符或者是(任何转义的)父目录反向链接或者是(任何转义的)通配符(因为它匹配第一个匹配文件并且至少在 Mac OS X 上返回 true)或者包含 C ANSI 转义任何地方的序列,信号错误。其他任何东西,即使不合法或不合法,也应该简单地返回“文件不存在”,因此可以提供给“if(-e $folder)”。
【问题讨论】:
-
我没有。谢谢。我现在有。 :-)
-
只看主要交替的第一个成员 (
...|...|...|...),我可以告诉你,你的线路位置向后。$匹配行的end;^开头。将美元符号放在开头不会匹配任何内容--除非您正在进行多行匹配。 -
你是对的。对不起大家感兴趣。它必须是 ^...$。我会把它留给用户来纠正它。
-
如果你想去掉路径,也许可以看看File::Basename。
标签: perl filenames sanitization