检查字符串是否有效

ask*_*rno 7 php validation

我有个问题.我有一个PHP脚本(PHP 5),它将URL参数保存$_GET['file']到变量中$file.现在有办法检查此变量是否是有效的文件名(例如:hello.txt而不是/../otherdir/secret.txt).因为没有检查$ file变量,黑客就可以使用它/../来获取我的父文件夹.

kam*_*pal 7

您可以查看php的basename函数,它将返回文件名,请参见下面的示例:

$file = '../../abc.txt';
echo basename($file); //output: abc.txt
Run Code Online (Sandbox Code Playgroud)

注意: basename从路径字符串获取文件名,而不管文件是否存在.file_existsfunction可用于验证文件是否物理存在.

  • 作为旁注,这并不是真正检查文件名是否"有效".它只是删除任何内容,包括最后一个PHP目录分隔符.我理解OP的意图就是这样做.但其他人可能认为这证实了某些东西 - 而事实并非如此. (6认同)
  • `$ file ='../../abc\text.txt'; echo basename($ file);`将回显abc \ text.txt,它不是有效的文件名。 (2认同)

cor*_*ote 7

POSIX“完全可移植的文件名”列出了这些:A-Z a-z 0-9 . _ -

使用此代码使用正则表达式根据 POSIX 规则验证文件名:

  • /- 正斜杠(如果您需要验证路径而不是文件名)
  • \w- 相当于[0-9a-zA-Z_]
  • - . - 点划线空间
$filename = '../../test.jpg';
if (preg_match('/^[\/\w\-. ]+$/', $filename)) 
    echo 'VALID FILENAME'; 
else 
    echo 'INVALID FILENAME';
Run Code Online (Sandbox Code Playgroud)

如果您想确保它没有路径(没有正斜杠),请将正则表达式更改为'/^[\w\-. ]+$/'.