javascript - 确保 jQuery 和 PHP 中的 AJAX 服务调用安全(使用 session token )

标签 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 可用于生成 token 。

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

我认为我可以保护来自浏览器中输入的 URL 的每个调用,但是我发现两个严重的威胁:

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

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

有人可以进一步帮助我吗?

最佳答案

将 csrf token 与表单一起发送,并在您的 .php 文件中使用类似的内容

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

通过所有服务调用发送 CSRF token

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

关于javascript - 确保 jQuery 和 PHP 中的 AJAX 服务调用安全(使用 session token ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20427805/

相关文章:

javascript - 键盘事件.code

javascript - Gulp Uglify 的基本设置?

javascript - 公开 jQuery 插件属性

javascript - jQuery 函数未附加到 dom 元素

javascript - 如何使用 jQuery.end()?

javascript - 如何为 Handsontable 中的所有空单元格提供默认值 0?

javascript - 尝试使用 Array.prototype.filter 访问嵌套对象字段时出现未定义错误

javascript - 将 CKEditor 与 CKfinder 结合使用并将内容保存到数据库

php - 奇怪的php方法调用

php - 在TFS中 checkin 时检索文件的MD5