当前位置: 首页 > 知识库问答 >
问题:

REST和Slim 3:为什么使用post方法进行CSRF检查失败?

谢阳曜
2023-03-14

我想在使用Slim3创建的Web应用程序上添加具有REST API的用户。我在应用程序上使用相同的路线添加用户,它的作品。但是通过一个ajax请求,因为另一个网站我有“400个坏请求”,因为CSRF检查失败。在此请求之前,我做了一个GET方法来获取CSRF令牌,并使用CSRF令牌数据构建隐藏输入。然后我给CSRF令牌在POST方法,但它不工作...我不明白。

谢谢。

Ajax获取方法:

$.get("https://extranet.exemple.fr/api/token", {})
            .done(function (data, text, jqxhr) {
                if (data.success === true) {
                    $("#csrf_name").val(data.csrf.csrf_name);
                    $("#csrf_value").val(data.csrf.csrf_value);
                }
            })
            .fail(function (jqxhr) {})
            .always(function () {});
            });

阿贾克斯邮报:

var csrfname = $("#csrf_name").val();
var csrfvalue = $("#csrf_value").val();
var objajaxargs = {
                    dataUser: dataUser,
                    csrf_name: csrfname,
                    csrf_value: csrfvalue,
                };
                $.post("https://extranet.exemple.fr/user/add", objajaxargs)
                    .done(function (data, text, jqxhr) {
                        if (data.success === true) {
                            alert("success");
                        }
                    })
                    .fail(function (jqxhr) {})
                    .always(function () {});

在我的容器里

$container["csrf"] = function ($container) {
    return new \Slim\Csrf\Guard();
};

Slim-GET方法

$app->get('/api/token', function (\Slim\Http\Request $request, \Slim\Http\Response $response, $args) use ($app) {

$container = $app->getContainer();
// Generate new token and update request
$request = $container->csrf->generateNewToken($request);
// Build Header Token
$nameKey = $container->csrf->getTokenNameKey();
$valueKey = $container->csrf->getTokenValueKey();
$name = $request->getAttribute($nameKey);
$value = $request->getAttribute($valueKey);
$tokenArray = [
    $nameKey => $name,
    $valueKey => $value
];

$respCSRF["success"] = false;
if (!empty($tokenArray)) {
    $respCSRF["success"] = true;
    $respCSRF["csrf"] = $tokenArray;
}

return $response->withJson($respCSRF);});

苗条POST方法

$app->post("/user/add", function (\Slim\Http\Request $request, \Slim\Http\Response $response, $args) use ($app) {

$container = $app->getContainer();
$objBody = $request->getParsedBody();
$objUser = new \App\Models\UserModel($container);

foreach ($objBody["dataUser"] as $key => $value) {
    $objAdherent->$key = $value;
}

$arrJsonResponse = ["success" => false];

if (filter_var($objUser->mail, FILTER_VALIDATE_EMAIL) !== false) {
    $infosAdd = $objUser->addUser();
    if ($infosAdd !== false) {
        $arrJsonResponse["success"] = true;
        return $response->withJson($arrJsonResponse)->withStatus(201);
    }
} 

return $response->withJson($arrJsonResponse)->withStatus(400);});

共有1个答案

卞成荫
2023-03-14

我解决了我的问题。我将csrf令牌持久性设置为true,它可以工作!

解决方案:

 /**
 * Init CSRF
 * @return \Slim\Csrf\Guard
 */
$container["csrf"] = function ($container) {
    $guard = new \Slim\Csrf\Guard();
    $guard->setPersistentTokenMode(true);
    return $guard;
};
 类似资料:
  • 问题内容: 我可以通过我的AJAX帖子向遵循Django CSRF保护机制的人员提供帮助。我按照这里的指示进行: http://docs.djangoproject.com/en/dev/ref/contrib/csrf/ 我已经精确地复制了他们在该页面上拥有的AJAX示例代码: http://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax

  • 问题内容: 因此,我一直在浏览有关创建REST API的文章。其中一些建议使用所有类型的HTTP请求:like 。我们将创建例如 index.php 并以这种方式编写API: 好的,理所当然-我对Web服务还不太了解。但是,通过常规或(包含方法名称和所有参数)接受 JSON 对象,然后也以JSON进行响应,会不会更容易。我们可以轻松地通过PHP进行序列化/反序列化,并且无需处理不同的HTTP请求方

  • 响应代码应该是什么,它同时具有创建和更新操作:

  • 问题内容: 我可以通过我的AJAX帖子向遵循Django CSRF保护机制的人员提供帮助。我按照这里的指示进行: http://docs.djangoproject.com/en/dev/ref/contrib/csrf/ 我已经精确地复制了他们在该页面上拥有的AJAX示例代码: http://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax

  • 我正在使用AWS S3 REST API,在解决了一些恼人的签名问题后,它似乎起作用了。但是,当我使用正确的REST动词创建资源时,即,我得到。相同的请求可以很好地使用方法并创建资源。 是我做错了什么,还是AWS S3 REST API不完全符合REST?

  • 我在使用方法时遇到了麻烦。下面是我的代码: 如您所见,在扫描仪检查是否有另一行之后,我输入三行作为输入。问题发生在我的文件的末尾。扫描器扫描文件的最后一行并执行while-loop,即使没有足够的行来完成循环而不引发异常。 有什么方法可以使用方法检查文件中是否还有多行?感谢您的时间和您所能提供的任何帮助。

  • 我不知道POST和PUT方法的确切区别。有些人在网上说,当你们更新记录的时候,你们必须使用PUT方法而不是POST,我不知道这是真的吗?? 如果你的网站URL在POST方法1.www.example。com/user/{id}/update:-使用2.www.example。com/user/update:-使用后这是否正确??

  • 我需要使用rest模板使用以下详细信息进行post调用: 我需要发送带有4/5个参数的json,需要为内容类型和接受设置标题,并使用be post设置方法。 您可以帮助我使用示例代码来创建json对象、设置头并进行post调用吗