помощь с PHP, POST, COOKIE, JQUERY - PullRequest
0 голосов
/ 13 сентября 2010

Я разрабатываю приложение для сайта клиента.Вот история, эта компания использует приложение / HDD, называемое synology, которое в основном представляет собой блок жесткого диска, подключенный к Интернету, и предоставляет доступ к файлам клиентам с предварительно созданными учетными записями.Этот интерфейс написан на CGI, и у меня нет доступа к коробке (отличной сети и местоположения от веб-сайта).

Что мы хотим сделать, так это разрешить вход в систему с основного веб-сайта (я создаю) в обход(по крайней мере, для пользователей: D) форма входа в приложение.

Я, очевидно, не могу сделать ajax-запрос jQuery для разных доменов, он не будет работать.Итак, что я сделал, это

1) Форма на веб-сайте, работающем с jQuery:

$("#login_submit").click(function(){
    var username= $("input#login_username").val();
    var passwd= $("input#login_passwd").val();
    var post_string = "username=" + username + "&passwd=" + passwd ;
    $.ajax({
        type : "POST",
        url: "login.php",
        data : post_string,
        success: function(response){

            if (response){
                $('.result').html("OK");
                window.location = "http://XX.XX.net:5000/webman/index.cgi";
             }
             else {
                 $('.result').html("INVALID");
             }
        }
    })
    return false;
}

2) Позвоните на страницу login.php при передаче имени пользователя и паролячерез POST страница PHP отправляет HTTP-запрос POST на удаленный сервер Synology и дает мне ответ в JSON, очевидно (?), что я конвертирую в массив PHP, чтобы я мог видеть, является ли ключ «success» истинным или ложным,если true, код jquery напечатает сообщение OK и перенаправит на удаленный сервер sylonogy, где я смогу получить доступ к моим данным, зарегистрированным в системе!

<?php
function do_post_request($url, $data, $optional_headers = null)
{
  $params = array('http' => array(
              'method' => 'POST',
              'content' => $data
            ));
  if ($optional_headers !== null) {
    $params['http']['header'] = $optional_headers;
  }
  $ctx = stream_context_create($params);
  $fp = @fopen($url, 'rb', false, $ctx);
  if (!$fp) {
    throw new Exception("Problem with $url, $php_errormsg");
  }
  $response = @stream_get_contents($fp);
  if ($response === false) {
    throw new Exception("Problem reading data from $url, $php_errormsg");
  }
  return $response;
}

if ($_SERVER['REQUEST_METHOD'] == "POST"){
    $username = $_POST["username"];
    $passwd = $_POST["passwd"];

    $response =json_decode(do_post_request($url = "http://XX.XX.net:5000/webman/login.cgi", $data = "username=".$username."&passwd=".$passwd), true);

            if($response["success"]){
                $send = true;
            }
            else {
                $send = false;
            }
        echo  $send;
}

Проблема здесь в том, что login.cgi страница должна установить cookie-файл сеанса для этого сервера, но с использованием этого PHP-запроса это не так.Он даст ответ, но не установит cookie для браузера.Есть ли у вас какие-либо идеи, что я могу сделать, чтобы имитировать запрос браузера POST и установить cookie, поддерживая эту функцию jquery?может мне стоит установить заголовки?Если создать для этой простой формы login.cgi в качестве «действия», файл cookie сеанса будет сохранен, но пользователь, конечно, останется на той странице, которую я не могу изменить, поскольку у меня нет к ней доступа.

Ответы [ 2 ]

1 голос
/ 13 сентября 2010

Используйте stream_get_meta_data() для извлечения HTTP-заголовков, возвращаемых с сервера <-> запросов на синологию.Если остальная часть вашего кода работает правильно с правильными URL-адресами / параметрами синологии, заголовки, возвращаемые из запроса на вход в систему, должны содержать cookie-файл сеанса, необходимый для аутентификации дальнейших запросов в окне синтаксиса.

Затем вы можете сохранить этов файле сеанса связи сервера <-> с пользователем и вытащите его для последующих запросов.

комментарий:

да, точно.Запросы, инициируемые скручиванием, выполняются исключительно на стороне сервера и не затрагивают клиента вообще.Несмотря на то, что вы МОЖЕТЕ получить cookie-файл сеанса / доступа Synology с помощью curl, невозможно отправить этот cookie клиенту так, чтобы он выглядел так, как будто он получен непосредственно из окна Synology.

Например, давайте представим, чтоЗаголовок cookie-файла ответа synology выглядит следующим образом:

Set-Cookie: sessionID=blahblahblah; path=/; domain=synologybox.com

Вы извлекаете идентификатор сеанса и пересылаете его клиенту:

setcookie("sessionID", 'blahblahblah', 360000, '/');

, тогда клиент будет сохранять его как пришедший из yourserver.com, а не synologybox.com.Кроме того, вы не сможете установить домен с помощью вызова setcookie:

setcookie("sessionID", 'blahblahblah', 360000, '/', 'synologybox.com')

Это не будет работать, так как запрос на сервер <-> клиента поступает с yourserver.com, что нигдепочти такой же, как synologbox.com.

Без доступа к блоку Synology для взлома дополнительных средств аутентификации вы, скорее всего, застряли при необходимости создания полной прокси-версии интерфейса Synology.

0 голосов
/ 13 сентября 2010

Если вы делаете этот запрос в PHP, тогда cookie отправляется на ваш сервер, а не на клиент. Вы не можете установить cookie для другого домена из своего приложения, поэтому это не будет работать. Вам нужно придерживаться метода на стороне клиента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...