Итак, мне удалось войти на свой сайт из C# winforms (с файлом cookie ...), так что запрещенные страницы становятся доступными, как только я получаю файл cookie, но проблема возникает, когда я пытаюсь опубликовать новые данные после успешного входа в систему ... тогда я получаю «403 запрещено».
Другими словами:
Вот класс, который я использую, чтобы помочь мне войти в систему, снова это работает для входа в систему, но не для публикации (например, сведения о редактировании ...), когда я вошел в систему:
/// помощник, производный класс 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 ожидать от php, но я использую другой метод, который показывает некоторый "JSESSIONID ... что-то", когда я использую правильную комбинацию пароля / имени пользователя admin / admin ... ничего не отображается, если я пытаюсь с неправильная комбинация + Я также получаю «403 запрещено» при использовании неправильного имени пользователя / пароля.
Еще одна вещь: я также вижу «403 запрещено», если страница не существует. Но я уверен, что edit.php существует и доступен, на всякий случай я пробовал использовать как относительные, так и абсолютные пути. Опять же, страница входа в систему работает таким же образом.
Если я правильно понял вашу проблему, вы хотите сказать, что упомянутый вами блок не работал только для почтовых запросов ?? и если вы вместо этого используете метод downloadString, он работает. не так ли?
Да, идея состоит в том, чтобы войти в систему и просмотреть страницы, для которых требуется логин / пароль. Хорошо ... Я могу это сделать! Но ... несмотря на то, что я вошел в систему, я все еще не могу отправлять новые запросы POST, например, я не могу редактировать информацию, и кажется, что у меня есть доступ только для чтения, но не для чтения + записи ... что глупо поскольку в браузере я могу делать все, что угодно, после входа в систему.
Другими словами: моя программа должна работать так же, как веб-браузер: я должен войти в систему один раз, а после входа в систему я должен читать и писать, так же, как я делаю через свой веб-браузер. Пока я могу читать только страницы с ограниченным доступом, но не могу POST / писать.
Можете ли вы сначала очистить все файлы cookie в браузере, а затем передать заголовок пользовательского агента в создаваемом веб-запросе? например client.UserAgent = "мой пользовательский агент"
Кто-то, кстати, упомянул, что возможное решение - использовать файлы cookie в веб-ответе? Однако я столкнулся с проблемой включения файлов cookie, полученных в веб-ответе, вот предполагаемое решение: stackoverflow.com/questions/30977809/…
Да, думаю, у меня получится, сейчас попробую, спасибо. Но опять же, я на 90% уверен, что это связано с исчезновением / отсутствием файлов cookie там, где они должны ...
Хорошо, я надеюсь и подозреваю, что этот подход должен помочь: stackoverflow.com/questions/11164275/…
Идея состоит в том, что если я не могу использовать / переписать все методы WebClient, но я все еще хватаю и вижу файл cookie после успешного входа в систему, я могу просто отправить новый пост с моими новыми данными + файл cookie, который у меня уже есть, из входа в систему , верный?
Совершенно верно. Если вы передадите все файлы cookie, полученные при успешном входе в систему, вы сможете отправить запрос req.





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