【问题标题】:jsGrid: How to pass additional variables from javascript to php using ajaxjsGrid:如何使用 ajax 将附加变量从 javascript 传递到 php
【发布时间】:2020-02-18 09:59:26
【问题描述】:

I'm using jsGrid for my project. View here for original source code

我想传递一个额外的变量调用 $user_session 用于 fetch.php 中的 mysql 选择查询,但失败了。以下是我一直在尝试的。

<script>

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

//......

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

 //......

这里是 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);
}
//......
?>

这样做的正确方法是什么?

【问题讨论】:

    标签: javascript php mysql ajax jsgrid


    【解决方案1】:

    首先,任何人都可以在浏览器中打开开发控制台并开始对会话 ID 进行模糊测试。当您正确准备查询、化解 sql 注入时,它并不能保护您免受 IDOR 的影响,或者,我可以通过重复查询您的应用程序来枚举您的用户。

    如果您真的想在客户端传递会话 ID,也许您可​​以考虑使用 cookie,因为普通用户不太容易编辑它。

    【讨论】:

      【解决方案2】:

      我可以这样做。

      <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>
      

      在 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);
      }
      //......
      ?>
      

      对于@Andrea Golin提到的安全问题,我会再发一个问题。
      谢谢。

      【讨论】:

        【解决方案3】:

        最后,我找到了更好的方法。
        我可以直接在 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);
        }
        ?>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-01-21
          • 1970-01-01
          相关资源
          最近更新 更多