如何清理$ _GET变量以防止路径注入?

Adr*_*ian 4 php security

清理$_GET['']请求的最佳方法是什么?我想只允许从一个目录下载文件.

$baseDir = "/home/html/xy.com/public_html/downloads/";    
$path = realpath($baseDir . $_GET['file']);  
Run Code Online (Sandbox Code Playgroud)

你下一步怎么做?

Bra*_*rad 13

以下是我在那里排队后会做的事情:

if (dirname($path) === $baseDir) {
    //Safe
}
Run Code Online (Sandbox Code Playgroud)

http://php.net/dirname

基本上,在发送任何文件实际位于您支持的路径之前进行检查.注意,您还必须/在文件名(in $path)之前添加自己的文件并将其从$baseDir定义中删除,因为dirname()不会留下尾随路径分隔符.

  • @Adrian,在继续之前你应该真正理解这是如何工作的.如果你不这样做,你的这个剧本有可能是危险的.我的方法确保`$ path`中文件的路径与`$ baseDir`中指定的路径相同.如果有人使用`..`或`/`,那么这些路径将不再匹配.因此,它是安全的.你明白这一点很重要.如果您正在检查多个目录,则问题会变得复杂得多. (3认同)