【问题标题】:Securing an AJAX service call in jQuery and PHP (with session token)在 jQuery 和 PHP 中保护 AJAX 服务调用(使用会话令牌)
【发布时间】:2013-12-06 15:35:35
【问题描述】:

我目前正在构建一个框架,例如 form submit 被实现为 jQuery ajax 调用 .php(服务)文件。

部分jQuery供参考:

var dataSerialized = $(form).serialize();
var service = $(form).attr("action");
$.ajax({
    url: "services/" + service + ".php",
    data: dataSerialized,
    type: "POST",
    cache: false,
    dataType: "json",
    success: function(json) {
        $(json).each(function() {
            loadPage(this.callback);
        });
    },
    error: function(json, message) {
        finalError(message);
    }
});

.php 目前所做的不过是:

include_once("../content/includes/connect.php");
include_once("_functions.php");

//TODO: support sending variables
$check = true;
$callback = "error";

foreach ($_POST as $key => $value) {
    list($pass, $errormessage) = checkRules("register", $key, $value);
    if (!$pass) {
        $check = false;
        $callback = "error";
        break;
    }
}

if ($check) {
    $callback = "register_success";
}

echo json_encode(array(
    "callback" => $callback
));

SQL::close();

现在我希望服务调用尽可能安全,鉴于我的情况,我看到以下选项:

  • 不能使用 SSL,因为它相对来说太贵了。只是在做一个国产项目,没什么重要的。
  • 无法使用 jCryption 库,因为我使用的是廉价的虚拟主机,并且无法访问服务器本身。
  • OAuth 2.0 是一种可能,但似乎相当复杂。
  • $_SERVER 变量可用于帮助保护服务.php 页面,但不可靠。
  • $_SESSION 可用于生成令牌。

我已经实施了一个简单的措施:将GET 更改为POST。这只会阻止最简单的攻击,现在攻击者实际上需要使用一些篡改工具,而不是能够直接通过浏览器进行。

我认为我可以保护来自在浏览器中输入的 URL 的每个呼叫,但是我看到两个严重的威胁:

  1. 向网络服务器直接请求:攻击者可以传递他想要的任何数据。
  2. 使用浏览器 JavaScript 控制台发送自定义 jQuery 请求。

在这种情况下,我认为最好还是尝试使用 $_SESSION 令牌保护服务 .php 页面,但我该怎么做呢?
它们需要在服务调用之前的某个时间点设置,然后服务调用可以检查它。
我还可以访问MySQL 数据库,当然还有网络空间上的纯文本文件。

谁能帮帮我?

【问题讨论】:

  • 为什么不根据当前时间戳生成令牌并稍后验证呢?
  • 您的网络应用程序中是否已经有某种形式的身份验证?
  • @Pekka웃 还没有认证。除了常规的输入检查。

标签: javascript php jquery ajax session


【解决方案1】:

将 csrf 令牌与表单一起发送,在您的 .php 文件中,您可以使用类似这样的东西

session_start();
if ($_SERVER['HTTP_X_CSRF_TOKEN'] !== $_SESSION['csrfToken']) {
   return false;
    die();
}

在所有服务调用中发送 CSRF Token

$.ajaxSetup({
    headers: {
        'X-Csrf-Token': "TOKEN HERE"
    }
});

【讨论】:

  • 抱歉,我不太明白它的作用,令牌会在哪里生成以及它会保护什么?
  • 创建一个会话变量$_SESSION['csrfToken'] 并在表单加载之前分配一个随机值。将此变量分配给表单中的隐藏输入。使 http 标头 X-Csrf-Token 成为此隐藏字段的值。就是这样。
  • 我不想在我的 HTML 表单中使用 PHP,所以我必须通过服务调用来设置/获取令牌。看来我不能保护它。
  • 它不必在您的表单中。或者,您可以在标题部分使用<meta content="SESSION TOKEN" name="csrf-token"> 标记并将其分配给您的ajax 标题,如$('meta[name="csrf-token"]').attr('content')
  • 我明白了你的意思,但是如果我把它作为服务,这整个令牌仍然保存吗?问题是我网站上的一个页面只加载一次,所有其他页面“加载”都是内联 AJAX 请求。
猜你喜欢
  • 1970-01-01
  • 2014-01-23
  • 2014-08-16
  • 2014-04-05
  • 2016-01-30
  • 2016-09-19
  • 2015-07-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多