安全地在PHP中传递变量html表单

时间:2012-09-05 08:38:22

标签: php forms variables hidden

我有一个由MySQL数据库中的数据填充的表单。要对表单进行更新/编辑,我想使用该记录的主键。如何在提交页面后安全地将主键传递到页面。我不想使用$ _GET,因为任何用户都可以在URL上更改此内容,并且在隐藏的表单字段中嵌入主键也可以被破坏并且在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>

2 个答案:

答案 0 :(得分:2)

这里有什么问题?是的,用户可以更改正在编辑的记录的ID,因此输入的数据将保存到另一个记录中。

...

那又怎样?与用户访问该其他记录的页面并直接在其中进行编辑没有任何不同。您仍然可以使用访问控制来检查是否允许用户编辑记录,对吧?您还有适当的数据验证,可以验证提交的数据是否对特定记录有效,对吗?

然后这里没有真正的问题。如果用户能够编辑特定记录,他就能够以这种或那种方式这样做。简单地将ID放在URL中就足够了。

答案 1 :(得分:0)

如果用户可以轻松更改$ _GET或$ _POST数据,则不存在安全问题。 事实上,如果它只是一个显示请求(当然,在这种情况下,你的php代码必须确保它可以由用户显示),你可以将它放在你的$ _GET url上,并在你的$ _POST上数据如果要修改数据库中存储的数据。

这是获取和发布请求的目的,不要试图用其他工具发明一些东西。将来保持运作将是一团糟。