2014-04-09 5 views
0

그래서 게시물에 대해 rss.reader와 함께 markdown 형식을 사용하는 간단한 간단한 블로그에서 작업하고 있습니다. 매우 간단하지만 사람들이 내가 게시물을 만들 수 있기를 원하는 것은 복잡합니다. 그래서 hallojs를 사용하는 형식을 입력하면 간단한 "파일 작성자"를 만들었습니다. hallowj에 대한 변환 된 코드 다운 코드를 가져 와서 사용자 입력 (2014-04-08_markdown-file-test.md)을 기반으로 파일에 씁니다. index.html과 post.php로 구성되어 있습니다. 한 가지 문제를 제외하고는 원활하게 진행됩니다.PHP Markdown/file editor 보안

블로그 게시물을 만들 수있는 특정 "웹 사이트"가 세 개 있으므로 선택 옵션이 포함되어 있습니다. 즉, 내 디렉토리를 사용할 수 있으며 쉽게 선택할 수 있습니다. 악의적 인 크래커들. 보안 대책으로서 필자는 필요한 모든 .htaccess를 "모든 것을 거부하고"몰래 침입하는 것을 막기 위해 포함 시켰지만 형식에 따라 쉽게 자신의 파일을 주입하고 실행할 수 있으므로 필자는 이것을 막는 방법을 찾아라. 내 첫 번째 생각은 PHP 파일의 디렉토리를 index.html에 명시 적으로 표시하는 것과는 대조적으로 선언하고있었습니다. 그러나 나는 혼란스럽고 지금은 서클에 들어갈 것입니다. 여기 내 소스는 다음과 같습니다

index.htm으로

<article> 
<div class="editable" contenteditable="true"> //hallojs user-input 
<h1>Create new post</h1> 

<p> Please edit your blog post! :D 
</p> 
</div> 
</article> 

<form name="form1" method="post" action="post.php"> 
<table width="100%" border="0" cellspacing="1" cellpadding="3"> 

<textarea id="source" id="textfield" name="textfield"></textarea> //markdown output 
<tr> 
<td width="16%">Date</td> 
<td width="2%"></td> 
<td width="82%"> 
<input name="date" type="text" id="date" size="50"></td> 
</tr> 
<tr> 
<td>Title</td> 
<td></td> 
<td><input name="title" type="text" id="title" size="50"></td> 
</tr> 
<tr> 
<td>Which Site?</td> 
<td></td> 
<td><select name="dir"> 
<option value="path/to/dir1">Site1</option> 
<option value="path/to/dir2">Site2</option> 
<option value="path/to/dir3">Site3</option> 
</select></td></tr> 
<td>&nbsp;</td> 
<td>&nbsp;</td> 
<td><input type="submit" name="Submit" value="Submit"></td> 
</table></form> 

post.php 나는 어쩌면 드롭 다운의 값을 변경하는 생각

<?php 
$date  = $_POST['date']; 
$title  = $_POST['title']; 
$underscore = "_"; 
$dir   = $_POST['dir']; 
$myfile  = fopen("$dir/$date$underscore$title.md", 'w'); 
if ($_SERVER['REQUEST_METHOD'] == "POST") 
{ 
      $myfile or die("Can't open file for writing."); 
      fwrite($myfile, $_POST['textfield']); 
      fclose($myfile); 
      echo "Content saved. "; 
      echo "Your file: <b>" ; 
      echo $date; 
      echo $underscore; 
      echo $title . ".md</b> "; 
      echo "was successfully created!"; 

    } 


// Print the form  
?> 

에 "DIR1 ... dir2는 ... dir3 .. "라고 말하면서 다음과 같은 작업을 수행하지만 보안이 제대로 작동하는지 확인하기 만하면됩니다.

나는 그렇게 생각하지 않습니다. 단지 그것을 보면서. 어떤 도움을 주셔서 감사합니다. 아, 그리고 누군가가 내 $ 밑줄 문제를 구성한다면 그것은 굉장 할 것입니다. 파일 이름 출력은 날짜 다음에 밑줄이 있어야합니다. 그것은 밑줄을 쳐서 시도한 것에 상관없이 작동하지 않았습니다. 그렇지 않으면 "$ date_이 설정되지 않았습니다"와 같은 오류가 발생하고 파일 이름이 $ title.md 입력으로 간단히 지정됩니다. 정말 재밌 네요.

답변

0

Sooo ... 알아 냈습니다! 여기에 내가 경우 누구 변경 어떤 동일한 문제를 가지고 (홀수 하나가 될 것입니다)입니다 :

<?php 
$date  = $_POST['date']; 
$title  = $_POST['title']; 
$underscore = "_"; 
$dir   = ""; 
if(!isset($_POST['dir'])) $_POST['dir']=""; 
switch($_POST['dir']) { 
case "Site1": $dir = "path/to/site1"; break; 
case "Site2": $dir = "path/to/site2"; break; 
case "Site3": $dir = "path/to/site3"; break;  
} 

$myfile  = fopen("$dir/$date$underscore$title.md", 'w'); 
if ($_SERVER['REQUEST_METHOD'] == "POST"){ 

$myfile or die("Can't open file for writing."); 
fwrite($myfile, $_POST['textfield']); 
fclose($myfile); 
echo "Content saved. "; 
echo "Your file: <b>" ; 
echo $date; 
echo $underscore; 
echo $title . ".md</b> "; 
echo "was successfully created to the website: <b>"; 
echo $_POST['dir']; 
echo "</b>"; 

    } 


// Print the form 
?> 

내가 그 일을 있었 도대체 단지 논리적 그래서 내가 한 것처럼 보였다 무슨 생각이 없기 때문에 나는이 일에 놀란다 그.

재밌는 점은 원래의 생각이 효과적이었고, 그 곳의 모든 곳이 극도로 추악 해 보였으므로 스위치 문을 사용하기로 결정했기 때문에 그들은 매우 깨끗하고 깨끗합니다. 나는 $ 밑줄 문제를 아직 이해하지 못했다 ... 그러나 대부분의 경우 그것은 더 안전하다! :}