使用jQuery和PHP保护AJAX服务调用(使用会话令牌)

时间:2013-12-06 15:35:36

标签: javascript php jquery ajax session

我目前正在构建一个框架,其中例如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请求。
  3. 我认为在这种情况下再次尝试使用.php令牌保护服务$_SESSION页面是最好的,但我该如何解决这些问题?
    需要在服务呼叫之前将它们设置为某个时间点,然后服务呼叫可以检查它 我还可以访问网站空间中的MySQL数据库,当然还有纯文本文件。

    任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

将csrf令牌与表单一起发送,并在.php文件中使用此类内容

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

使用所有服务电话发送CSRF令牌

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