在许多关于保护文件上传的文章中都说,最好准备一个扩展名白名单而不是黑名单。但是这种方法似乎对双扩展名文件有一些问题。例如,我有一个像 'pdf','doc','docx' 这样的白名单,但这个白名单对于 apple.php.doc 或 apple.doc.php 返回 true。
如何编写安全扩展检查功能?
在许多关于保护文件上传的文章中都说,最好准备一个扩展名白名单而不是黑名单。但是这种方法似乎对双扩展名文件有一些问题。例如,我有一个像 'pdf','doc','docx' 这样的白名单,但这个白名单对于 apple.php.doc 或 apple.doc.php 返回 true。
如何编写安全扩展检查功能?
使用此代码检查扩展是否良好:
$valid_exts = array('doc', 'pdf');
if (in_array(pathinfo($filename, PATHINFO_EXTENSION), $valid_exts)) {
// everything is fine
} else {
// not fine
}
您应该尝试了解其原因,您的问题没有任何意义。
您不应该允许任何特定扩展的原因是某些网络服务器(如 Apache)根据它们确定文件的服务器方式,当然这只适用于它们公开服务的目录中的文件,但大多数时候上传的文件到那里,所以当您允许服务器将执行的扩展程序(如 .php)时会发生什么,它允许网络上的随机人员在您的站点上注入代码。
.php.doc 不会发生这种情况,因为扩展名仍然是 .doc 并且服务器会这样对待它。
值得一提的是,可以将网络服务器配置为不执行目录中的某些文件,但这不是默认设置,实际上很少有人这样做。