CURL Session Management - PullRequest
       21

CURL Session Management

2 голосов
/ 09 августа 2011

Я создаю приложение, основанное на API, который требует базовой аутентификации.Я сделал много звонков и завернул запросы CURL внутри класса, который я сделал,

Я использую банку печенья, которую я использую так:

curl_setopt($curl_handle, CURLOPT_COOKIEJAR, "cookie.txt");
curl_setopt($curl_handle, CURLOPT_COOKIEFILE, "cookie.txt");

Япытаясь сохранить сеансы с помощью cookie.txt для хранения файлов cookie, и это прекрасно работает.Однако сегодня я натолкнулся на тревожное открытие.Когда кто-то (на другом компьютере) заходит в мое приложение, он может видеть информацию о моем сеансе (возможно, потому, что он использует тот же файл, что и ссылка на сеанс).Я думал, что, возможно, я мог бы создать новую «банку печенья» для каждого посетителя, но это, вероятно, не сработает, когда дело доходит до производства.Количество пользователей будет, по крайней мере, в тысячах, поэтому я думаю, это означает, что мне понадобится файл cookie для каждого посещения, верно?

Это не кажется практичным, не говоря уже о том, что я бынеобходимо создать файл cookie программно.Кто-нибудь еще сталкивался с этой проблемой раньше?Любые предложения будут реальной помощью.

Возможно, существует решение CURL setopt, которое бы однозначно распределяло файлы cookie среди посещений?

Спасибо!

1 Ответ

1 голос
/ 09 августа 2011

Если вы можете предоставить cookie пользователю , если вы включите curl_setopt ($ curl_handle, CURLOPT_HEADER, 1), заголовки, возвращаемые exec curl, будут отображаться в верхней части содержимого, вы можете сопоставьте их с верхней частью содержимого и передайте их браузеру клиентов для сохранения, а затем передайте все пользовательские файлы cookie через процесс скручивания для следующего запроса.

что-то грубое, что я сделал некоторое время назад:

  if(is_array($_COOKIE))
  {
    foreach($_COOKIE as $cookiename => $cookievalue)
    {
      if($cookievalue)
      {
        if(get_magic_quotes_gpc())
        {
          $cookievalue = stripslashes($cookievalue);
        }
        $cookies[] = $cookiename .'='. urlencode($cookievalue);
      }
    }
    if(is_array($cookies))
    {
      curl_setopt($curl_handle, CURLOPT_COOKIE,implode('; ',$cookies));
    }
  }

после локона exec

  preg_match_all('%HTTP/\\d\\.\\d.*?(\\r\\n|\\n){2,}%si', $curl_result, $header_matches);
  $headers = split("\r\n", str_replace("\r\n\r\n",'',array_pop($header_matches[0])));
  if(is_array($headers))
  {
    foreach ($headers as $header)
    {
      preg_match('#(.*?)\:\s(.*)#', $header, $header_matches);
      if(isset($header_matches[1]))
      {
        $headers[$header_matches[1]] = $header_matches[2];
      }
      // SET THE COOKIE
      if($header_matches[1] == 'Set-Cookie')
      {
        header('Set-Cookie: ' . $header_matches[2],false);
      }
    }
  }
  # Remove the headers from the response body
  $curl_result = preg_replace('%HTTP/\\d\\.\\d.*?(\\r\\n|\\n){2,}%si','',$curl_result);
...