简体   繁体   English

jsGrid:如何使用 ajax 将附加变量从 javascript 传递到 php

[英]jsGrid: How to pass additional variables from javascript to php using ajax

I'm using jsGrid for my project. 我正在为我的项目使用 jsGrid。 View here for original source code 在此处查看原始源代码

I want to pass an additional variable call $user_session to use for mysql select query in fetch.php but failed.我想传递一个额外的变量调用 $user_session 用于 fetch.php 中的 mysql 选择查询,但失败了。 Below is what i have been trying.下面是我一直在尝试的。

<script>

var user_session = "<?php echo $user_session; ?>"; //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

//......

 controller: {
  loadData: function(){
   return $.ajax({
    type: "GET",
    url: "fetch_data.php",
    data: {user_session:user_session} //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
   });
  },

 //......

Here's the fetch.php file这是 fetch.php 文件

<?php

if($method == 'GET')
{
 $user_session = $_GET['user_session']; //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

 $query = "SELECT * FROM sample_data WHERE first_name=? ORDER BY id DESC";
 $statement = $connect->prepare($query);
 $statement->execute($user_session); //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
 $result = $statement->fetchAll();
 foreach($result as $row)
 {
  $output[] = array(
   'id'    => $row['id'],   
   'first_name'  => $row['first_name'],
   'last_name'   => $row['last_name'],
   'age'    => $row['age'],
   'gender'   => $row['gender']
  );
 }
 header("Content-Type: application/json");
 echo json_encode($output);
}
//......
?>

What is the proper way to do this?这样做的正确方法是什么?

First of all, anyone could open up a dev console inside a browser and start fuzzing your session id.首先,任何人都可以在浏览器中打开一个开发控制台并开始模糊你的会话 ID。 While you are correctly preparing your query, defusing sql injection, it does does not protect you from an IDOR, or, i could enumerate your users by just querying your application repeatedly.当您正确准备查询时,解除 sql 注入,它并不能保护您免受 IDOR 的影响,或者,我可以通过重复查询您的应用程序来枚举您的用户。

If you really want to pass your session id client-side, maybe you could consider using a cookie, as it is less easily editable by a normal user.如果您真的想在客户端传递会话 ID,也许您可​​以考虑使用 cookie,因为普通用户不太容易对其进行编辑。

I'm able to do by this way.我可以通过这种方式。

<script>

//......

 controller: {
  loadData: function(filter){
    var user_session = "<?php echo $user_session; ?>"; //<<<<<<<<<<<<<<<<<<<<<<<<<<<
   return $.ajax({
    type: "GET",
    url: "fetch_data.php",
    data: {filter,
           user_session:user_session //<<<<<<<<<<<<<<<<<<<<<<<<<<<
          },
   });
  },

 //......
</script>

In fetch.php i do this.在 fetch.php 我这样做。

<?php

if($method == 'GET')
{
 $user_session = $_GET['user_session'];//<<<<<<<<<<<<<<<<<<<<<<<<<<<

 $query = "SELECT * FROM sample_data WHERE first_name=? ORDER BY id DESC";
 $statement = $connect->prepare($query);
 $statement->execute([$user_session]); //<<<<<<<<<<<<<<<<<<<<<<<<<<<
 $result = $statement->fetchAll();
 foreach($result as $row)
 {
  $output[] = array(
   'id'    => $row['id'],   
   'first_name'  => $row['first_name'],
   'last_name'   => $row['last_name'],
   'age'    => $row['age'],
   'gender'   => $row['gender']
  );
 }
 header("Content-Type: application/json");
 echo json_encode($output);
}
//......
?>

For the security issue mentioned by @ Andrea Golin , i will post another question.对于@Andrea Golin提到的安全问题,我将发布另一个问题。
Thanks.谢谢。

Finally, i found a better way.最后,我找到了更好的方法。
I can directly call $user_session inside fetch.php.我可以在 fetch.php 中直接调用 $user_session 。

<?php
require('user_session.php'); //<<<<<<<<<<<<<<<<<<<<<<<<<<<
require('includes/db.php');

$method = $_SERVER['REQUEST_METHOD'];

if($method == 'GET')
{
 $query = "SELECT * FROM sample_data WHERE first_name=? ORDER BY id DESC";
 $statement = $conn->prepare($query);
 $statement->execute([$user_session]); //<<<<<<<<<<<<<<<<<<<<<<<<<<<
 $result = $statement->fetchAll();
 foreach($result as $row)
 {
  $output[] = array(
   'ChildID'    => $row['ChildID'],
   'Name'  => $row['Name'],
   'BirthDate'   => $row['BirthDate'],
   'Gender'   => $row['Gender'],
   'StudyorWorking'   => $row['StudyorWorking'],
   'CourseorOccupation'   => $row['CourseorOccupation'],
   'Married'   => $row['Married']
  );
 }
 header("Content-Type: application/json");
 echo json_encode($output);
}
?>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM