1

我想知道是否可以在两个请求之间保持 PHP 会话处于活动状态......

我使用Flurl 插件执行请求:

    public const string ApiUrl = "http://localhost/z/api.php";

    public static string MethodName()
    {
        using (FlurlClient client = new FlurlClient())
        {
            string res = client.HttpGet(string.Format("{0}?action={1}", ApiUrl, "captcha"), true);

            //Some actions...

            return client.HttpPost(ApiUrl, new { action = "resolve-captcha", input = r }, false);
        }
    }

    public static string HttpPost(this FlurlClient client, string url, object data, bool keepalive = false)
    {
        return client.Request(url).PostUrlEncodedAsync(data).ReceiveString().GetAwaiter().GetResult();
    }

    public static string HttpGet(this FlurlClient client, string url, bool keepalive = false)
    {
        return client.Request(url).GetStringAsync().GetAwaiter().GetResult();
    }

在 PHP 部分(API)中:

//if isset $_GET then switch action key...
case "captcha":
    if (session_status() == PHP_SESSION_NONE)
        session_start();

    $_SESSION['phrase'] = "hello";
    break;

//if isset $_POST then switch action key...
case "resolve-captcha":
    $secret = @$_SESSION["phrase"];

    if(session_status() == PHP_SESSION_NONE)
        die("No session!");
    else
        $coreData["secret"] = $secret;

    $input = @$_POST["input"];
    $coreData["valid"] = $input === $secret;
    break;

但由于某种原因,每次我执行下一步(发布)时,api 都会返回没有任何会话正在运行。

正如你在这里看到的:

...

我一直在阅读,所有答案都说相同,我必须使用 cookie,cookie 有什么用?存储服务器应该保留的秘密?我需要知道如何在同一个会话中执行两个请求,或者至少如果可能的话,因为我不想使用 MySQL(带有 ID 系统,即),我更喜欢让它变得简单。

4

1 回答 1

1

HTTP 作为无状态协议,“保持会话活动”的唯一方法是在查询字符串中提供会话标识符,或者包含作为第一个身份验证请求的一部分返回的 cookie。

这是用户从 Web 浏览器甚至 cURL 访问 Web 应用程序的典型范例。

从 SOAP 时代到现在,大多数 API 的设置都不同。他们让您对每个请求进行身份验证。更实用的是它们的使用方式......来自服务器端代码或 Xhr 客户端。

例如,如今使用JWT 令牌进行身份验证是一种常见的方法。您可以将带有签名令牌的 URI 公开给最终用户,并且没有潜在的重放攻击,不必担心。

我认为您应该阅读这篇出色的文章,而不是我试图解释:http : //shiflett.org/articles/the-truth-about-sessions 当涉及到sessionscookies- 值得查看手册中与这两个相关的 INI 设置相关的部分。

好的,所以 API 是 PHP 代码,对吧……?

session_start() 根据通过 GET 或 POST 请求或通过 cookie 传递的会话标识符创建会话或恢复当前会话。

一个好的第一步可能是通过您的 Web 浏览器向 API 发出请求,然后查看响应,您是否看到服务器发送的 cookie?

在对 API 的后续请求中,您是否看到正在使用这些 cookie - 我们假设没有要求您重新进行身份验证?这就是它的要点。同样,根据基于 API cookie 的会话的性质,可能不是最好的方法。

因此,看起来对 cookie 的支持已添加到您使用的 HTTP 包装器中...... https://github.com/tmenier/Flurl/issues/14

可能是一种更原生的方法?在 .net 4.5 中尝试使用 HttpClient 使 cookie 无法响应

于 2018-05-08T22:01:41.643 回答