CORS - API 身份验证:会话(CSRF 安全性) - 解决方法



我目前正在使用 CORS 方法(将我的外部请求从 example.com/api?param=args 重写为 example.com/api/public/api.php?param=args )并发送如下所示的 get 请求:

$.get('http://www.example.com/api'), { param: "args" })
    .done(function (data) {
        alert(data);
    });

这绝对可以正常工作,我现在可以使用对我的 API 软件的请求和响应进行跨域引用。

我现在想知道,我设置了一个测试请求以尝试实现Session.

session_start();
if(isset($_GET['store'])):
    $_SESSION['key'] = $_GET['store'];
elseif(isset($_GET['show'])):
    echo $_SESSION['key'];
endif;

当我直接在浏览器中访问链接时,这工作正常,但是,当我从外部域发送请求时,第二个请求似乎"忘记"了我存储的Session key

法典:

$.get('http://www.example.com/api'), { store: "test" })
    .done(function () {
        $.get('http://www.example.com/api'), { show: "args" })
            .done(function (data) {
               alert(data);
        })
    });

数据未定义

有没有办法让发送请求的服务器实际上"保存"或"记住"API服务器上的会话,或者有没有办法通过使用解决方法来实现这一点?

请注意,该 API 将由多个人使用 - 就像插件一样 - 一旦他们发送一个Register带有该帐户管理员详细信息的请求,每个key都会被实际添加,所以我需要某种身份验证来使用 API,并且实际上想不出不使用会话或使用会话使其工作的方法。

另请注意,如果我正在使用会话(如您所见),它会创建一个CRSF attack。也有解决方法吗?

默认情况下,凭据(如 Cookie)不会在跨源请求时发送,因为它们会触发预检请求。

jQuery 文档描述了如何启用凭据:

$.ajax({
   url: a_cross_domain_url,
   xhrFields: {
      withCredentials: true
   }
});

实际上想不出不使用会话的方法

响应正文中传递身份验证令牌。用 JS 阅读它。让 JS 将其包含在每个请求中。

另请注意,如果我使用会话(如您所见),它会产生 CRSF 攻击。也有解决方法吗?

不要在访问控制允许源标头中使用*源。仅允许受信任的站点使用您的 API。

相关内容

最新更新