Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过$\u POST安全地传递php对象_Php_Json_Forms_Post_Serialization - Fatal编程技术网

通过$\u POST安全地传递php对象

通过$\u POST安全地传递php对象,php,json,forms,post,serialization,Php,Json,Forms,Post,Serialization,我有一个Student类的实例化PHP对象,我想通过用户单击li元素触发的$\u POST传递给表单。javascript代码提交表单。我想通过访问$\u POST来检索对象,然后将对象的参数分配给php变量,然后这些变量将被回送到输入字段。如果我使用HTTPS,这安全吗?我如何对PHP对象进行编码和解码,以便它可以通过表单传递,然后作为Student类的对象进行检索和重构?我真的不确定实现这一点的最佳方式,因为我已经看到使用JSON、serialise和Base64。目前我查过的问题似乎都没有

我有一个Student类的实例化PHP对象,我想通过用户单击li元素触发的$\u POST传递给表单。javascript代码提交表单。我想通过访问$\u POST来检索对象,然后将对象的参数分配给php变量,然后这些变量将被回送到输入字段。如果我使用HTTPS,这安全吗?我如何对PHP对象进行编码和解码,以便它可以通过表单传递,然后作为Student类的对象进行检索和重构?我真的不确定实现这一点的最佳方式,因为我已经看到使用JSON、serialise和Base64。目前我查过的问题似乎都没有完整的答案

@$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>
@$selected\u student=$\u POST['student\u identifier';
//实例化教师对象
$teacher=新教师();
$teacher->teacherId=$\u会话['id'];
//getStudents方法创建并返回Student类的对象数组
$students=$teacher->getStudents($teacher->teacherId);

在不受信任的数据上使用PHP
非序列化是不安全的(而且来自HTTP请求的任何内容都不能被信任,无论是否使用令牌)

最好的方法是只传递识别对象所需的最小数据(如学生id),然后按id从数据库中加载。而且(重要!)不要忘记验证学生的老师


如果出于任何原因,您绝对无法从数据库加载对象,那么您可以采用一些加密技术,并使用仅存储在服务器上的密钥(例如,在会话中)对值进行加密和签名。然后,当您从请求中获取值时,验证签名,解密并取消序列化该值。

这不安全,您没有使用csrf令牌,并且您使用的
action=“”
将XSS打开到您的表单。我正在使用每次提交表单时生成的crsf令牌-抱歉,这只是代码的一个片段OK,很难从您的代码中分辨出来,实际的
学生标识符
$studentObject
都没有在任何地方使用或定义。我不知道当一个简单的id就足够(然后查找对象)时,为什么要在数据中放入一个对象,同时一个大的base64字符串也鼓励好奇者进行进一步的调查。serialize不会保护数据。另外,使用ids
ints
可以使用base62对其进行编码以混淆ID,或者使用像hashid这样的LIB