安全地通过$ _POST传递php对象

时间:2017-09-17 19:45:04

标签: php json forms post serialization

我有一个类Student的实例化PHP对象,我希望通过$ _POST传递一个表单,该表单由用户点击li元素触发。 javascript代码提交表单。我想通过访问$ _POST来检索对象,然后将对象的参数分配给php变量,然后将其回显到输入字段。如果我使用HTTPS,这是否安全?以及如何编码然后解码PHP对象,以便它可以通过表单传递,然后检索和重建为类Student的对象?我真的不确定最好的方法来解决这个问题,因为我已经看过使用JSON,序列化和基础64.我检查的当前问题似乎没有完整的解决方案。

@$selected_student = $_POST['student_identifier'];

// instantiates the teacher object
$teacher = new Teacher();
$teacher->teacherId = $_SESSION['id'];

// getStudents method creates and returns an array of objects of class Student
$students = $teacher->getStudents($teacher->teacherId);

<form id="select_student" method='POST' action="<?php echo ($_SERVER['PHP_SELF']); ?>"> 
<?php
// iterates the student array displaying the name of each index in the array and setting the value as the student object  that I want passed via the form submission        
foreach($students as $studentObject) {
    ?>
    <li>
        <b><?php echo $studentObject->studentName; ?></b>
        <input type="hidden" id="student_identifier" name="student_identifier" value='<?php echo  serialize($studentObject); ?>'>
    </li>
    <?php
} 
?>
</form>

1 个答案:

答案 0 :(得分:1)

在不受信任的数据上使用PHP unserialize根本不安全(无论是否使用令牌,都无法信任来自HTTP请求的任何内容。)

最好的方法是仅传递识别对象所需的最小数据(例如学生ID),然后通过id从数据库加载它。并且(重要的!)不要忘记还要验证学生的老师。

如果由于某种原因绝对无法从数据库加载对象,则可以使用一些加密并使用仅存储在服务器上的密钥对值进行加密和签名,例如,在会话中。然后,当您从请求中获取值时,请验证签名,解密并反序列化该值。