WebResponse не использует Passed In Cookies для аутентификации - PullRequest
1 голос
/ 01 мая 2019

Я занимаюсь разработкой консольного приложения на C # для извлечения данных с сайта PHP. Веб-сайт имеет как публичное, так и расширенное представление для зарегистрированных пользователей. Я могу использовать свои учетные данные, свое имя пользователя и пароль для входа на сайт через FireFox, Edge и ID и успешного просмотра дополнительного материала. Анализ открытых данных не является проблемой, но проблема заключается в извлечении расширенных данных.

Я пытался использовать различные методы для создания файлов cookie на основе моих учетных данных для доступа к расширенному представлению. Моя логика такова: есть php-страница входа в систему с именем пользователя и паролем. После успешного входа в систему каждый последующий доступ к общедоступной странице будет отображать дополнительную информацию (расширенные данные), если вы вошли в систему.

Я пытаюсь либо передать свои учетные данные через контейнер cookie в httpwebrequest, либо скопировать мои существующие файлы cookie из firefox (после входа в систему) в мой контейнер cookie для моего httpwebrequest. После этого я бы использовал объект HttpWebResponse для просмотра возвращенного потока данных. Именно там я должен быть в состоянии идентифицировать расширенные данные в HTML. Однако, насколько мне известно, он только что вернул общественное мнение.

Я могу успешно открыть cookie-файлы firefox, но не знаю, успешно ли они используются в CookieContainer

//!!!!Firefox cookie method!!!!//

CookieContainer ffCookieContainer = new CookieContainer();
Cookie ffCookie = new Cookie();
bool fRtn = false;
string strPath, strTemp, strDb, strHost, strField, Value;

strPath = @"C:\Documents and Settings\YourUserName\Application Data\Mozilla\Firefox\Profiles\urq2tlhr.default\cookies.sqlite";
strDb = "Data Source=" + strPath;

// Now open the temporary cookie jar and extract Value from the cookie if we find it.
using (SqliteConnection conn = new SqliteConnection())
{
    using (SqliteCommand cmd = conn.CreateCommand())
    {
        cmd.CommandText = "SELECT host, name, value, path, expiry, isSecure, isHttpOnly, lastAccessed, id FROM moz_cookies;"; 
        conn.ConnectionString = strDb;
        conn.Open();
        using (SqliteDataReader reader = cmd.ExecuteReader())
        {
            while (reader.Read())
            {
                Value = reader.GetString(0) + " " + reader.GetString(1) + " " + reader.GetString(2) + " " + reader.GetString(3) + " " + reader.GetString(4) + " " + reader.GetString(5) + " " + reader.GetString(6) + " " + reader.GetString(7) + " " + reader.GetString(8);
                if (!Value.Equals(string.Empty))
                {
                    //fRtn = true;
                    //break;
                    try
                    {
                        ffCookie.Discard = false;
                        ffCookie.Expired = false;
                        ffCookie.Domain = reader.GetString(0);
                        ffCookie.Expires = Convert.ToDateTime("01/01/2025");
                        ffCookie.Domain = reader.GetString(0);
                        ffCookie.HttpOnly = false;
                        ffCookie.Secure = false;
                        ffCookie.Port = "";
                        ffCookie.Name = reader.GetString(1);
                        ffCookie.Path = reader.GetString(3);
                        ffCookie.Value = reader.GetString(2);
                        Console.WriteLine(Value);
                        ffCookieContainer.Add(ffCookie);
                    }
                    catch (Exception)
                    {
                    }
                }
            }
        }
        conn.Close();
    }
}

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("website/view");
request.CookieContainer = ffCookieContainer;

//SECOND METHOD creating cookies based on credentials
string parameters = "username=blah@domain.com&password=blah";
string userName = "blah@domain.com";
string password = "blah";
string url = "example.com/index.php?forcelogin=1";
HttpWebRequest requestTwo = (HttpWebRequest)WebRequest.Create(url);
requestTwo.Method = "POST";
requestTwo.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
requestTwo.Headers.Add("Accept-Encoding: gzip,deflate");
requestTwo.Headers.Add("Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7");
requestTwo.KeepAlive = true;
requestTwo.Headers.Add("Keep-Alive: 900");
requestTwo.Referer = "example.com/index.php?forcelogin=1";
requestTwo.ContentLength = parameters.Length;
requestTwo.ContentType = "application/x-www-form-urlencoded";
requestTwo.CookieContainer = new CookieContainer();

using (Stream stream = requestTwo.GetRequestStream())
{
    byte[] paramAsBytes = Encoding.Default.GetBytes(parameters);
    stream.Write(paramAsBytes, 0, paramAsBytes.Count());
}
CookieContainer myContainer = new CookieContainer();

using (HttpWebResponse responseTwo = (HttpWebResponse)requestTwo.GetResponse())
{
    foreach (var cookie in responseTwo.Cookies)
    {
        var properties = cookie.GetType()
                               .GetProperties()
                               .Select(p => new
                               {
                                   Name = p.Name,
                                   Value = p.GetValue(cookie)
                               });

        foreach (var property in properties)
        {
            Console.WriteLine("{0}: {1}", property.Name, property.Value);
        }
    }
    myContainer = requestTwo.CookieContainer;
}
//repeat the cookie reassignment to the web request for the public view of the web page

//READ THE RESPONSE
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
if (response.StatusCode == HttpStatusCode.OK)
{
    Stream receiveStream = response.GetResponseStream();
    StreamReader readStream = null;
    if (response.CharacterSet == null)
        readStream = new StreamReader(receiveStream);
    else
        readStream = new StreamReader(receiveStream, Encoding.GetEncoding(response.CharacterSet));
    string data = readStream.ReadToEnd();
    response.Close();
    readStream.Close();
}

Я ожидаю, что смогу увидеть вновь сгенерированное значение html на странице ответа, но я его не вижу.

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