2012-09-05 7 views
0

MySQL 데이터베이스의 데이터로 채워진 폼이 있습니다. 양식을 업데이트/편집하려면 해당 레코드의 기본 키를 사용하고 싶습니다. 페이지가 제출되면 안전하게 페이지에 기본 키를 전달할 수 있습니다. 모든 사용자가 URL에서 이것을 변경할 수 있고 숨겨진 양식 필드에 기본 키를 포함시키는 것도 방해 할 수 있고 HTML 소스에서 볼 수 있으므로 $ _GET을 사용하고 싶지 않습니다. 작업이 동일한 페이지에서 수행되고 있습니다 (아래 코드 블록 참조). 처리가 동일한 페이지에서 수행되므로 세션이 작동하는지 확신 할 수 없습니다.PHP에서 변수 html 폼을 안전하게 전달합니다.

//Load the data from the database 
    if(isset($_GET['menu_id'])){ 
     $menu_id = (int)$_GET['menu_id']; 
     $menu = new Menu(); 
     $menu_item = $menu->get_menu_items_by_id($menu_id); 
    } 
    else{ 
     //The user has possibly edited the URL 
     $message = "Please select an option to edit"; 
     redirect_to($PHP_SELF . '?message=' . $message); 
    } 
?> 
<form method="POST" action="<?php echo $_SERVER['PHP_SELF'] ?>"> 

<div> 
<label>Name</label> 
<input type="text" name="name" value="<?php echo $menu_item->name ?>"> 
</div> 


<div> 
<label>Title</label> 
<input type="text" name="title" value="<?php echo $menu_item->title ?>"> 
</div> 


<div> 
<label>Is default page</label> 
<input type="radio" name="is_default_page" value="1" 
    <?php 
     if($menu_item->is_default_page == 1) 
      { 
      echo "checked"; 
      }?> 
    >Yes 
<input type ="radio" name="is_default_page" value="0" 
     <?php 
     if($menu_item->is_default_page == 0) 
      { 
      echo "checked"; 
      }?> 

    >No  
</div> 

<div> 
<label>Page name</label> 
<input type="text" name="page" value="<?php echo $menu_item->page ?>" /> 
</div> 

<div> 
<label>Menu type</label> 
<select name="menu_type"> 
    <?php 
    //Display the options of the menu types available 
    $menu_type_array = $menu->get_menu_types(); 
    draw_select($menu_type_array, 'name', 'id', $menu->menu_type_id); 
    ?> 
</select> 
</div> 

<div> 
    <label>Page type i.e what is the page used for</label> 
    <select name="page_type"> 
     <?php 
     $page = new Page(); 
     $page_type_array = $page->get_page_types(); 
     draw_select($page_type_array, 'name', 'id', $menu->page_type_id) 
     ?> 
    </select> 
</div> 

<div> 
    <label>Position</label> 
    <select name="position"> 
     <?php 
     //Count the number of menus in the database 

     $number_of_menu_items = $menu->count_menu_items() + 1; 
     for($i=1; $i<=$number_of_menu_items; $i++){ 
      echo "<option value=\"{$i}\""; 
      if($i==$menu->position){ 
       echo "selected = \"selected\""; 
      } 
      echo ">"; 
      echo "{$i}"; 
      echo "</option>"; 
     } 

     ?> 
    </select> 
</div> 

<div> 
    <input type="submit" value="Add Menu" name="edit_menu" /> 
</div> 


<form> 
+0

출력을 이스케이프 처리해야합니다. '' –

+0

@ 잭의 페이지 제목을 입력하지 못하는 것 같습니다. 고마워. 나는 준비된 문장을 사용하기 시작 했으므로 멈추었다 :(. 나의 입력과 놀랍게도 시도해 봤다. ... 감사합니다. – user1180807

답변

0

사용하면 쉽게 $ _GET 또는 $ _POST 데이터를 변경할 수 있지만 보안상의 문제는 아닙니다. 실제로 표시 요청 일 경우 $ _GET URL에 넣을 수 있습니다 (물론이 경우에는 PHP 코드가 사용자가 표시 할 수 있도록해야합니다). 그리고 $ _POST 데이터는 데이터베이스에 저장된 데이터를 수정하려는 경우에 사용됩니다.

get 및 post 요청의 목적은 다른 도구로 무언가를 발명하려고하지 마십시오. 앞으로도 계속 작동 시키면 엉망이 될 것입니다.

+0

감사합니다.하지만 데이터가 $ _GET 또는 $ _POST 인 경우 보안 문제가 발생할 수 있습니다. GET 변수의 값을 변경하면 다른 사용자의 레코드에 액세스 할 수 있습니다. 제 경우에는 필요한 보안 수준을 얻을 수 있도록 사용자 권한을 추가해야합니다. – user1180807

+0

전혀 아닙니다. 현재 사용자가 필요한 데이터에 액세스 할 수 있는지 확인하는 것은 사용자의 몫입니다. – artragis

2

여기에 어떤 문제가 있습니까? 예. 사용자가 편집중인 레코드의 ID를 변경할 수 있으므로 입력 한 데이터가 다른 레코드에 저장됩니다.

...

그래서요? 사용자가 다른 레코드의 페이지로 이동하여 직접 다른 레코드와 편집하는 것과는 전혀 다릅니다. 사용자가 처음부터 레코드를 편집 할 수 있는지 확인하는 액세스 제어가 여전히 있습니다. 맞습니까? 또한 제출 된 데이터가 특정 레코드에 대해 유효한지 확인하는 데이터 유효성 검사가 수행됩니다.

여기에는 실제 관심사가 없습니다. 사용자가 특정 레코드를 편집 할 수 있다면 그 레코드를 다른 방법으로 편집 할 수 있습니다. id에 URL을 넣는 것만으로도 충분합니다.

+0

빠른 응답을 보내 주셔서 감사합니다. 원하는 보안 수준을 달성하려면 사용자 권한을 추가해야 할 수도 있습니다. 필드를 변경하려면 GET 또는 숨겨진 변수를 사용하십시오. – user1180807

관련 문제