gpt4 book ai didi

javascript - 如何使用 PHP 和 jQuery 发送安全的 AJAX 请求

转载 作者:IT王子 更新时间:2023-10-29 01:21:10 25 4
gpt4 key购买 nike

问题

一段时间以来,我一直在尝试使用不同的 AJAX 方法将数据发送到将在 MySQL 数据库中处理和存储的服务器。

AJAX 请求命中api.php 的页面,使用PHP 的PDO prepared statements 保存数据,所以MySQL 注入(inject)不是真正的问题,需要加密的密码或数据也由 api.php 处理,这不是我在这里要问的。我的问题更多地涉及如何确保数据在从客户端传输到服务器时是安全的。

方法

我目前有(对于我在下面包含的登录示例):

  • 域上运行的 SSL 证书/HTTPS。
  • 某些 AJAX 请求(显然不是这个登录请求示例,因为没有 session 开始)只有在 PHP session 在整个站点上有效时才有效(用于 login.phpapi.php 在这个例子中)。
  • 访问函数时对 api.php 进行速率限制。
  • api.php 中与数据库交互时,PHP PDO 准备了语句。
  • 加密 api.php 中的敏感数据(与问题无关)。

问题

最后,我的问题是:

  1. 这种使用异步 HTTP (Ajax) 请求的方法是否足够安全,可以使用而不是仅仅将数据提交到 PHP 页面并向前重定向? (因为这种方式可以改善用户体验)。
  2. 如何检查我的用户发送的数据是否未被篡改?
  3. 我在保护用户数据方面是否做得足够合理?如果没有,我还能做些什么?

例子

我知道每个人都有不同的方法来处理他们网站的数据和传输这些数据。我也明白,无论您做什么,您永远无法得到 100% 的保护,因为您的系统可能存在您无法解决的漏洞和方法。我正在寻找有关我安全发送数据的一般方法的反馈/改进,而不是批评下面的特定代码,因为它只是一个例子。但欢迎任何建设性的答案。感谢您花时间阅读/回答。

function loginUser() {
var process = "loginUser";
var data = $("form").serializeArray();
data[1].value = SHA512(data[1].value); // sha then encrypt on api.php page
data = JSON.stringify(data);

$("#loginButton").html('<i class="fa fa-spinner fa-pulse fa-lg fa-fw"></i> Login');
$.ajax({
type: "POST",
url: "api.php",
data: {"process": process, "data": data},
success: function(data) {
if (data.response.state == "success") {
// if api.php returns success, redirect to homepage
} else {
// if api.php returns failure, display error
}
},
error: function(jqXHR, textStatus, errorThrown, data) {
// error handling
},
dataType: "json"
});
}

最佳答案

1.检查 ORIGIN header

作为 specified by OWASP ,这还不够,但推荐:

Although it is trivial to spoof any header from your own browser, it is generally impossible to do so in a CSRF attack, except via an XSS vulnerability. That's why checking headers is a reasonable first step in your CSRF defense, but since they aren't always present, its generally not considered a sufficient defense on its own.

还有 by Mozilla :

The Origin header is considered helpful against JSON data theft and CSRF attacks. The information provided by Origin--a bit of contextual request-creation information--should provide hints to web servers about trustworthiness of requests [...]

检查 HTTP_ORIGIN header 可以写成:

header('Content-Type: application/json');

if (isset($_SERVER['HTTP_ORIGIN'])) {
$address = 'http://' . $_SERVER['SERVER_NAME'];
if (strpos($address, $_SERVER['HTTP_ORIGIN']) !== 0) {
exit(json_encode([
'error' => 'Invalid Origin header: ' . $_SERVER['HTTP_ORIGIN']
]));
}
} else {
exit(json_encode(['error' => 'No Origin header']));
}

1. (二)检查REFERER header

再次from OWASP :

If the Origin header is not present, verify the hostname in the Referer header matches the site's origin. Checking the referer is a commonly used method of preventing CSRF on embedded network devices because it does not require a per-user state.. This method of CSRF mitigation is also commonly used with unauthenticated requests [...]

在 PHP 中使用 $_SERVER['HTTP_REFERER'] 检查 HTTP_REFERER 也很简单,你可以用它来更新上面的代码。


小心检查总是需要非常具体:不要只检查 example.comapi.example.com但完整的 https://example.com 。为什么 ?因为您可以使用 api.example.com.hacker.com 之类的来源来欺骗此检查。


<强>2。生成 CSRF token

一个解释清楚的answer specific to PHP has been given there ,简而言之:

  1. 生成 token :

    session_start();
    if (empty($_SESSION['csrf_token'])) {
    $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
    }
  2. 通过元数据(如 Github)将其添加到生成的 View 中:

    <meta name="csrf-token" content="<?= $_SESSION['csrf_token'] ?>">
  3. 设置 jQuery ajax 调用以包含此标记:

    $.ajaxSetup({
    headers : {
    'CsrfToken': $('meta[name="csrf-token"]').attr('content')
    }
    });
  4. 服务器端检查您的 AJAX 请求:

    session_start();
    if (empty($_SESSION['csrf_token'])) {
    $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
    }

    header('Content-Type: application/json');

    $headers = apache_request_headers();
    if (isset($headers['CsrfToken'])) {
    if ($headers['CsrfToken'] !== $_SESSION['csrf_token']) {
    exit(json_encode(['error' => 'Wrong CSRF token.']));
    }
    } else {
    exit(json_encode(['error' => 'No CSRF token.']));
    }

大多数 PHP 框架都有自己的 CSRF 实现,它们或多或少都基于相同的原理。


3. 清理验证用户输入。

你总是必须filter espace inputsvalidate them .


4.保护您的服务器


5.永远不要相信用户输入

正如@blue112 所说,它是最基本的security principles 之一.

enter image description here

关于javascript - 如何使用 PHP 和 jQuery 发送安全的 AJAX 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37912937/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com