javascript - jQuery/ Ajax : How to send data to an url without showing data in web-developers

标签 javascript php jquery ajax

我有一个小购物篮,我可以在其中添加产品。

这是我的index.php

...<script type="text/javascript" src="function.js"></script> 
<a title="Add to basket" onclick="add_product_to_cart('apple','1');" href="#">Apple</a><br>...

这是functions.js

function add_product_to_cart(item, id) {
    var item = item;
    var id = id;

    $.ajax({
      url: "ajax.php",
      type: "POST",
      data: {
        action: "add",
        name: item,
        id: id
      },
    success: function(data) {
      //do something
    }
  });
};

当我点击“Apple”时,参数被发送到 ajax,并且它们在 Firefox-Web-Developer 中可见。 是否有机会隐藏这些 POST 参数?也许是为了保护它免受外界的攻击?我的想法可能完全错误,如何将其添加到篮子中?感谢您的帮助!!

这是我的网络开发人员的屏幕截图。 Web-Developer Firefox

最佳答案

您无法隐藏在 Chrome 开发者工具的“网络”选项卡中记录的内容。即使可以,黑客也可以使用 Fiddler 或其他 Web 代理嗅探请求。客户端验证很好,但不是全部。大多数人不会试图非法向您的服务器发送请求,但我想有些人会。

您确实应该在服务器端验证发送到服务器的数据确实有效。不要依赖客户端来执行此操作,因为任何人都可以修改直接发送到服务器的内容。在您的 PHP 代码中,您将执行如下操作:

function validate_data($data)
{
    // other code here
    if(!is_discontinued($data['product_id']))
        add_to_cart($data['product_id']);
    // other code after
}

function is_discontinued($product_id)
{
    // do database query
    $is_discontinued = lookup_product($product_id);
    return $is_discontinued;
}

这是非常简单的,但它应该让您知道需要做什么。

编辑: 查看您最近的一些评论后,您可能还想包含 CSRF token 以确保请求来自您的域。这些 token 在服务器上生成,通常存储在表单中的隐藏字段中,并随每个请求发送回服务器。然后您在服务器上验证 token ,并在通过验证后执行您的操作。

请注意,这只会减慢大多数黑客的速度,但它可以阻止一些不死心执行非法请求的人。

就使用 AJAX 请求发送值而言,您需要选择隐藏字段并将其值添加到 POST 数据。您的 AJAX 请求将如下所示:

function add_product_to_cart(item, id) {
    var item = item;
    var id = id;

    $.ajax({
      url: "ajax.php",
      type: "POST",
      data: {
        action: "add",
        name: item,
        id: id,
        token: $('#csrf_token').val()
      },
    success: function(data) {
      //do something
    }
  });
};

在服务器 (PHP) 上,您将拥有如下内容:

function get_csrf_token()
{
    $token = md5(uniqid(rand(), TRUE));

    if (!isset($_SESSION['token'])) {  
        $_SESSION['token'] = $token;
    }
    else
    {
        $token = $_SESSION['token'];
    }

    return $token;
}

function valid_csrf_token()
{
    if(isset($_POST['token'])){
        if($_POST['token'] == $_SESSION['token'])
            return true;
        else
            return false;
    }
    else {
        return false; // no token was sent with the request
    }
}

然后在您的表单中,您将拥有这样的隐藏字段:

<input id="csrf_token" type="hidden" value="<?php get_csrf_token(); ?>" />

最后,您的原始 PHP 验证函数将包括 CSRF token 验证:

function validate_data($data)
{
    // other code here
    if(!is_discontinued($data['product_id']) && valid_csrf_token())
        add_to_cart($data['product_id']);
    else
        header('HTTP/1.1 400 Bad Request', true, 400); // set status to bad request
    // other code after
}

请注意,将状态设置为错误请求是可选的,但它会显示请求不符合预期。

关于javascript - jQuery/ Ajax : How to send data to an url without showing data in web-developers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22842805/

相关文章:

javascript - 为什么 jQuery 更改事件不适用于选择选项?

javascript - Restangular POST 总是空的

PhpStorm - 关于 NULL 值的检查

php - 为什么 "<?"不再有效,而只有 "<?php"有效?

javascript - 通过tr id从同一个表中读取td值

javascript - 使用 Jquery 获取最近父级 H4 的文本

javascript - 导航栏切换按钮在 Bootstrap v4.1.3 中不起作用

php - 连续计算多个值,连续两次遍历列

Javascript 在页面重新加载时运行

jquery - 如何更改 Jquery UI slider handle