Использование C# для POST-данных, оставаясь в системе (вход в систему работает, но после этого не публикуется ...)

Итак, мне удалось войти на свой сайт из C# winforms (с файлом cookie ...), так что запрещенные страницы становятся доступными, как только я получаю файл cookie, но проблема возникает, когда я пытаюсь опубликовать новые данные после успешного входа в систему ... тогда я получаю «403 запрещено».

Другими словами:

  1. Я отправляю POST с C#, используя логин / пароль, и в случае успеха я получаю cookie и ... сохраняю его где-нибудь (я думаю);
  2. После сохранения файла cookie я могу использовать обычный метод DownloadString для посещения страниц, которые в противном случае требуют входа в систему;
  3. Однако, несмотря на сохранение файла cookie, я не могу снова отправить POST, потому что сервер думает, что я не вошел в систему, и я получаю «403 foribdden»?

Вот класс, который я использую, чтобы помочь мне войти в систему, снова это работает для входа в систему, но не для публикации (например, сведения о редактировании ...), когда я вошел в систему:

/// помощник, производный класс WebClient ниже

    public class CookieAwareWebClient : WebClient
    {
        public CookieContainer cookie = new CookieContainer();

        //Properties to handle a timeout
        private int? _timeout = null;
        public int? Timeout
        {
            get
            {
                return _timeout;
            }
            set
            {
                _timeout = value;
            }
        }

        public void SetTimeout(int timeout)
        {
            _timeout = timeout;
        }


        //Properties to handle SSL
        private bool? _ssl = null;
        public bool? Ssl
        {
            get
            {
                return _ssl;
            }
            set
            {
                _ssl = value;
            }
        }

        public void SetSsl(bool ssl)
        {
            _ssl = ssl;
        }




        protected override WebRequest GetWebRequest(Uri address)
        {
            WebRequest request = base.GetWebRequest(address);


            if (request is HttpWebRequest)
            {
               (request as HttpWebRequest).CookieContainer = cookie;

                if (_timeout.HasValue)
                {
                    request.Timeout = _timeout.Value;
                }

                if (_ssl.Value==true)
                {

                    ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) => true;

                }


            }
            return request;
        }


    }

    //main implementation and usage of the above class below: 

    public void something()

    {

            var client = CookieAwareWebClient(); 

            client.Ssl = true; 
            ServicePointManager.ServerCertificateValidationCallback = 
            delegate(object 
            s, X509Certificate certificate, X509Chain chain, SslPolicyErrors 
            sslPolicyErrors) { return true; };
            client.Timeout = 7000;

            client.BaseAddress = "http://localhost:8080/"; 

            var loginData = new NameValueCollection();
            loginData.Add("username", "admin");
            loginData.Add("password", "admin");

            try
            {

         client.UploadValues("login.php", "POST",loginData);

            }
            catch (Exception r)
            {
                    MessageBox.Show(r.ToString());



            }

            try
            {


         string loggedin=client.DownloadString("http://localhost:8080/" + "/admin");




                Match checking_if_weare_loggedin = Regex.Match(loggedin, @"Jake");
                string checking = checking_if_weare_loggedin.ToString();
                if (checking.Length > 3)
                {
                    MessageBox.Show("Good, you're logged in, I can see 'Jake' in the html of the page!");
                }
                else
                {
                   MessageBox.Show("Something is not right...this shouldn't 
                   happen as try-catch cant even catch it!");
                }




                }

Вышеупомянутая часть работает, но ниже НЕ работает:

                    try
                    {

                        client.UploadValues("edit.php", "POST", loginData2);
                    }
                    catch (Exception r)
                    {
                        MessageBox.Show("lol error" + r.ToString());


                    }

///

Подводя итог, если я использую client.DownloadString, метод DownloadString, очевидно, отслеживает мои файлы cookie, поскольку, если я использую правильный пароль / имя пользователя, я могу посетить страницу «администратора», а регулярное выражение может просмотреть ее и прочитать приветствие "сообщение / источник HTML.

Однако, если не использовать метод downloadstring, выгрузка начинается с нуля?

Итак, как переопределить Webclient, чтобы файл cookie сохранялся независимо от того, какой метод я использую?

Большое спасибо! (Я надеюсь, что приведенный выше код полезен, по крайней мере, для людей, которые хотят войти в систему, поскольку в нем реализованы значения SSL / Timeout, он довольно хорош для входа в систему и чтения html, но опять же, он не работает, если вы хотите продолжать публикацию после входа в систему успешно).

Перед попыткой вы проверяли, что все запрошенные файлы cookie передаются при выполнении веб-запроса?

Debashish Saha 27.05.2018 22:15

Я не уверен, какие файлы cookie ожидать от php, но я использую другой метод, который показывает некоторый "JSESSIONID ... что-то", когда я использую правильную комбинацию пароля / имени пользователя admin / admin ... ничего не отображается, если я пытаюсь с неправильная комбинация + Я также получаю «403 запрещено» при использовании неправильного имени пользователя / пароля.

kpopguy 27.05.2018 22:18

Еще одна вещь: я также вижу «403 запрещено», если страница не существует. Но я уверен, что edit.php существует и доступен, на всякий случай я пробовал использовать как относительные, так и абсолютные пути. Опять же, страница входа в систему работает таким же образом.

kpopguy 27.05.2018 22:23

Если я правильно понял вашу проблему, вы хотите сказать, что упомянутый вами блок не работал только для почтовых запросов ?? и если вы вместо этого используете метод downloadString, он работает. не так ли?

Debashish Saha 27.05.2018 22:30

Да, идея состоит в том, чтобы войти в систему и просмотреть страницы, для которых требуется логин / пароль. Хорошо ... Я могу это сделать! Но ... несмотря на то, что я вошел в систему, я все еще не могу отправлять новые запросы POST, например, я не могу редактировать информацию, и кажется, что у меня есть доступ только для чтения, но не для чтения + записи ... что глупо поскольку в браузере я могу делать все, что угодно, после входа в систему.

kpopguy 27.05.2018 22:35

Другими словами: моя программа должна работать так же, как веб-браузер: я должен войти в систему один раз, а после входа в систему я должен читать и писать, так же, как я делаю через свой веб-браузер. Пока я могу читать только страницы с ограниченным доступом, но не могу POST / писать.

kpopguy 27.05.2018 22:37

Можете ли вы сначала очистить все файлы cookie в браузере, а затем передать заголовок пользовательского агента в создаваемом веб-запросе? например client.UserAgent = "мой пользовательский агент"

Debashish Saha 27.05.2018 22:40

Кто-то, кстати, упомянул, что возможное решение - использовать файлы cookie в веб-ответе? Однако я столкнулся с проблемой включения файлов cookie, полученных в веб-ответе, вот предполагаемое решение: stackoverflow.com/questions/30977809/…

kpopguy 27.05.2018 22:45

Да, думаю, у меня получится, сейчас попробую, спасибо. Но опять же, я на 90% уверен, что это связано с исчезновением / отсутствием файлов cookie там, где они должны ...

kpopguy 27.05.2018 22:46

Хорошо, я надеюсь и подозреваю, что этот подход должен помочь: stackoverflow.com/questions/11164275/…

kpopguy 27.05.2018 23:51

Идея состоит в том, что если я не могу использовать / переписать все методы WebClient, но я все еще хватаю и вижу файл cookie после успешного входа в систему, я могу просто отправить новый пост с моими новыми данными + файл cookie, который у меня уже есть, из входа в систему , верный?

kpopguy 27.05.2018 23:52

Совершенно верно. Если вы передадите все файлы cookie, полученные при успешном входе в систему, вы сможете отправить запрос req.

Debashish Saha 28.05.2018 18:47
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
12
45
0

Другие вопросы по теме