2017-09-17 12 views
0

私は、li要素をクリックしたことによってトリガされる$ _POST経由でフォームを渡したい、クラスStudentのインスタンス化されたPHPオブジェクトを持っています。 javascriptコードがフォームを送信します。 $ _POSTにアクセスしてオブジェクトを取得し、オブジェクトのパラメータをPHP変数に代入して、入力フィールドにエコーしたいとします。 HTTPSを使用すると安全ですか?どのようにしてPHPオブジェクトをエンコードし、デコードしてフォームを通過させ、クラスStudentのオブジェクトとして取得して再構築できるようにするのですか?私は、JSONの使用、serialise、base64を見てきたので、これに近づける最善の方法は本当にわかりません。私がチェックした現在の質問は完全な解決策ではないようです。 (関係なく、トークンを使用するのかを信頼することはできませんHTTPリクエストから来て、何でも)

@$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> 
+0

あなたのフォームにXSSを開く 'action =" <?php echo($ _SERVER ['PHP_SELF']);?> ''を使ってcsrfトークンを使いません。 –

+0

私は各フォーム提出でcrsfトークンを使用しています - 申し訳ありませんが、これはコードのスニペットです。 – jon

+0

本当にあなたのコードからは分かりません。実際の 'student_identifier'や' $ studentObject'はどこにも使用されていません。簡単なIDで十分である(オブジェクトを検索する)ときに、データにオブジェクトを入れる理由がわからないのですが、大きなbase64文字列は好奇心でさらに調査することを奨励します。シリアル化はデータを保護することを指摘します。 –

答えて

1

それは信頼できないデータにPHP unserializeを使用するために、全く安全ではありません。

最良のアプローチは、オブジェクト(学生IDなど)を識別するために必要な最小限のデータだけを渡し、IDでデータベースからロードすることです。そして、(重要!)生徒の先生を確認することも忘れないでください。

何らかの理由でデータベースからオブジェクトを絶対に読み込むことができない場合は、一部の暗号化を使用して、セッションなどでサーバーにのみ格納されている秘密キーで値を暗号化して署名できます。次に、リクエストから値を取得したら、署名を検証し、値を復号化してシリアル化解除します。

関連する問題