到目前为止,我已经构建了我的文件浏览器,但它非常不安全。 例如,当您插入“?dir = .. /”或“?dir = .. / .. / .. /”时,您可以查看您无法查看的文件。我的代码:
<?php
if(isset($_GET['dir']) && $_GET['dir'] !== "../") {$dir = $basedir.$_GET['dir']."/";} else {$dir = $basedir;}
if ($handle = opendir($dir)) {
if(isset($_GET['dir']) && $_GET['dir'] !== "") {echo "<a href='?dir='>back to root</a>";}
while (false !== ($file = readdir($handle))) {
if ($file != "." && $file != "..") {
if(filetype($dir . $file) == "file") {$filetype = what_suffix($file);} else {$filetype = "-";}
if(filetype($dir . $file) == "file") {$filesize = round( filesize($dir . $file)/1024/1024 ,2)." MB";} else {$filesize = "-";}
if(filetype($dir . $file) == "file") {$filedate = date("d.m.Y H:i:s", filectime($dir.$file));} else {$filedate = "-";}
if(filetype($dir . $file) == "file") {
echo(
"<tr>
<td><a href='?dir=".@$_GET['dir']."&file=".$file."'>".$file."</td>
<td>".$filetype."</td>
<td>".$filesize."</td>
<td>".$filedate."</td>
</tr>"
); } else {
echo(
"<tr>
<td><a href='?dir=".@$_GET['dir']."/".$file."'>".$file."</td>
<td>-</td>
<td>-</td>
<td>-</td>
</tr>"
); }
}
}
closedir($handle);
}
?>
我有办法限制吗? (我想我只是看不到树上的木头)
答案 0 :(得分:1)
这是我用于此类事情的基本安全检查。
function isSecurityViolation($dir) {
if (preg_match('#https?://#i', $dir)) {
return true;
}
// no directory traversal attempts
if (strpos($dir, '../') !== false) {
return true;
}
if (strpos($dir, "\x00") !== false) {
return true;
}
if (strpos($dir, '%00') !== false) {
return true;
}
return false;
}
检查以下违规行为:
..
在脚本开头的某处,你可以打电话:
if (isSecurityViolation($dir)) {
die('No soup for you.');
}