Login auf Forum mittels Anwendung

Es gibt 23 Antworten in diesem Thema. Der letzte Beitrag () ist von Snickbrack.

    Login auf Forum mittels Anwendung

    Hallöchen,

    ich wollte mal fragen ob es generell möglich ist sich mittels einer Anwendung an dem VBP-Forum anzumelden?

    Ich bekomme für den Versuch mit POST folgende Fhlermeldung: "The remote server returned an error: (403) Forbidden." was sich ja schon mal etwas blöd anhört.

    Und für GET bekomme ich folgendes: "Cannot send a content-body with this verb-type."

    Spoiler anzeigen

    C#-Quellcode

    1. ​static void Main(string[] args)
    2. {
    3. try
    4. {
    5. var client = new CookieAwareWebClient();
    6. client.BaseAddress = @"http://www.vb-paradise.de/";
    7. var loginData = new NameValueCollection();
    8. loginData.Add("username", "username");
    9. loginData.Add("password", "password");
    10. client.UploadValues("index.php/Login/", "GET", loginData);
    11. //Now you are logged in and can request pages
    12. string htmlSource = client.DownloadString("index.php");
    13. }catch(Exception e)
    14. {
    15. var adasd = e;
    16. }
    17. }


    Spoiler anzeigen

    C#-Quellcode

    1. ​public class CookieAwareWebClient : WebClient
    2. {
    3. private CookieContainer cookie = new CookieContainer();
    4. protected override WebRequest GetWebRequest(Uri address)
    5. {
    6. WebRequest request = base.GetWebRequest(address);
    7. if (request is HttpWebRequest)
    8. {
    9. (request as HttpWebRequest).CookieContainer = cookie;
    10. }
    11. return request;
    12. }
    13. }


    Hat das jemand schon mal versucht und was ähnliches rausbekommen?

    Wäre es hierfür nicht auch sinnvoll, bei einem Entwickler-Forum eine Login-API bereitzustellen?
    Ich bin mir sicher das es ein POST request sein muss.
    Desweiteren werden vermutlich auch mehr POST Daten benötigt als du sendest.

    Das Forbidden kann auf fehlende Daten im POST Request hindeuten. Könnte aber auch ein User Agent sein, der nicht zugelassen ist.
    Es könnte auch sein das HTTPS verwendet werden MUSS.
    //EDIT
    Jupp ziemlich sicher HTTPS Problem. Wenn ich selber auf die Seite gehe erhalte ich auch ein :

    403 Forbidden
    Das ist meine Signatur und sie wird wunderbar sein!
    @Mono, kann ich mit dem WebClient HTTPS vortäuschen oder nachbilden?

    Oder kann ich mit dem WebClient auch normal eine SSL-Verbindung öffnen?


    ich habe aber auch das hier gefunden: stackoverflow.com/a/7403590/3992990

    Ich öffne die VBP-Seite auch nicht über https also nur http, dann kann es ja schlecht an nem SSL-Fehler liegen.

    Eventuell ist es halt verboten, sich hier per Anwendung zu verbinden. Dann frage ich mich warum, hier geht das: spieleprogrammierer.de (ja, standardmäßig über https und keine Probleme mit meinem Source Code) und forum.3dgs-hobbyschmiede.de/index.php auch.

    Alles WBB, da frage ich mich, was dann hier falsch läuft...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Snickbrack“ ()

    @Mono
    da passiert nix, bzw. es ist ein Anmeldeformular. Ich kann leider es leider nicht weiter nachverfolgen als bis zum drücken des "Anmelden"-Buttons.

    Oder was meinst du mit

    Mono schrieb:

    Schau dir einfach genau an was beim Login passiert.
    ?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Snickbrack“ ()

    Ein üblicher Anmeldevorgang auf einer Webseite läuft so ab:
    - Client sendet GET Request auf die "LoginSite"
    - Webserver sendet die LoginSite (mit den nötigen Post Parametern die beim Submit wieder benötigt werden) und ggf iwelche Cookies
    - Client liest die Seite und sendet einen Post Request mit allen benötigten Postdaten und ggf. Cookies an die angegebene Seite im Form Submit
    - Webserver überprüft die Daten des Post Request und sendet einen Response mit Response Code und ggf. eine Weiterleitung und eventuell Session Cookies

    Das Ganze kann man auf Clientseite natürlich nachvollziehen. Im Google Chrome zB unter weitere Tools -> Entwicklertools -> Network

    Ich habe das schon oft für Leute gemacht. Aber ich denke versuche es mal selbst. Hier noch ein Beispiel wie man herangeht:
    Problem mit Net.Webclient

    Habe aber gerade keine Zeit es alles durchzuprobieren.

    Viel Glück
    Das ist meine Signatur und sie wird wunderbar sein!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Mono“ ()

    so, habe das ganze jetzt mal umgebügelt auf den HTTPWebRequest und das sieht dann so aus:

    Spoiler anzeigen

    C#-Quellcode

    1. private static string test = "";
    2. private static CookieContainer cc;
    3. private static Uri baseUrl = new Uri("https://www.vb-paradise.de/index.php/Login/");
    4. static void Main(string[] args)
    5. {
    6. HttpWebRequest request = (HttpWebRequest)WebRequest.Create(baseUrl);
    7. request.Method = "POST";
    8. cc = new CookieContainer();
    9. //neuer cookiecontainer mit anhängen
    10. request.CookieContainer = cc;
    11. //enthalt nach dem request die cookies
    12. HttpWebResponse res = null;
    13. request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36";
    14. NameValueCollection outgoingQueryString = new NameValueCollection();
    15. outgoingQueryString.Add("loginUsername", "Username");
    16. outgoingQueryString.Add("loginPassword", "Password");
    17. outgoingQueryString.Add("t", "bae71a4207d013ac8f8a028d7314902edfc7c60c"); //<--- ständig wechselnder String
    18. string postdata = outgoingQueryString.ToString();
    19. ASCIIEncoding ascii = new ASCIIEncoding();
    20. byte[] postBytes = ascii.GetBytes(postdata.ToString());
    21. Stream dataStream = request.GetRequestStream();
    22. // Write the data to the request stream.
    23. dataStream.Write(postBytes, 0, postBytes.Length);
    24. // Close the Stream object.
    25. dataStream.Close();
    26. res = (HttpWebResponse)request.GetResponse();
    27. Stream streamResponse = res.GetResponseStream();
    28. using (StreamReader sr = new StreamReader(streamResponse))
    29. {
    30. test = sr.ReadToEnd();
    31. }
    32. }


    der Parameter "t" wird hier als Hash von der Login-Maske erzeugt und den kann ich ja schlecht nachbilden wenn ich die Methode und den Start-Wert nicht hab.

    Also wird es einem hier etwas schwer gemacht sich per Anwendung zu verbinden. Oder ist es ein so banaler Fehler den ich begehe, dass ich mich schämen sollte @Mono?
    Es ist unmöglich das du nicht wissen kannst was du da senden musst, denn der Browser bekommt die Info ja auch und kann Sie mitschicken.Wenn es der Browser kann, dann kannst du es auch ;)
    Vermutlich erhälst du diese Info im GET Request an die Seite vorher.
    Dort musst du t vermutlich iwo auslesen.

    HTML-Quellcode

    1. <input type="hidden" name="t" value="xyz" />

    Sowas in der Art wird in der Form stehen.

    Wozu willst du dich automatisiert einloggen btw?
    Das ist meine Signatur und sie wird wunderbar sein!
    Wenn du dich nur einloggen willst, dann kannst du auch Tastendrücke (SendKeys-Klasse) verwenden ;D
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell
    über einen WebRequest? sicher?

    und ich möchte einfach mal testen, ob das funktioniert. Wie gesagt bei den anderen genannten Foren klappt das ohne jegliche Probleme, hier jedoch nicht.

    Auch nicht wenn ich mit Fiddler alle übertragenen Variablen mit übernehme. Also irgendwas ist hier komisch und "engstirnig"...

    Naja, lass ich das Forum halt aus.
    Ne...ich mein den Browser prozess starten, in die URL vb-paradise eingeben und dann mit Tab und Tastenanschlägen den Usernamen und das PW eingeben
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell
    @Marcus Gräfe

    öhm, so viel zum Thema kein UserAgent:

    C#-Quellcode

    1. request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36";​


    hatte ich aber auch schon im Startpost so drinne. Alle Parameter die beim "normalen" Login übergeben werden, übergebe ich hier auch. Ich greife sogar wie @Mono es mir gesagt hatte, diesen Parameter names "t" mit einem vorhergehenden Seitenaufruf der Login-Seite ab.

    Deswegen fühle ich mich grade etwas ver"Apple"t...
    Also @Snickbrack.
    Ich habe mir jetzt kurz Zeit genommen und genau das gemacht was ich dir geschrieben habe.
    Du warst offensichtlich nicht willens selber zu probieren. Ich konnte mich erfolgreich einloggen.
    Keine Ahnung was du da nicht hinbekommst.

    Hier der Code. Das hidden Feld t hole ich mir manuell, indem ich mir die seite in einer RichTextBox anzeigen lasse und dort das Hidden Feld Value raus kopiere.
    Aussderm habe ich einen Button für das Laden der Seite (GET Request) und einen zweiten zum einloggen (POST plus 2. GET Request).
    Außerdem eine Textbox in die ich T Eintrage

    Spoiler anzeigen

    VB.NET-Quellcode

    1. public partial class Form1 : Form
    2. {
    3. CookieContainer cc;
    4. Uri baseUrl = new Uri("https://www.vb-paradise.de/");
    5. Uri LoginUrl = new Uri("https://www.vb-paradise.de/index.php/Login/");
    6. private void button1_Click(object sender, EventArgs e)
    7. {
    8. //Erster GET
    9. HttpWebRequest request = (HttpWebRequest)WebRequest.Create(baseUrl);
    10. cc = new CookieContainer();
    11. request.CookieContainer = cc; //cookies werden hier reingeladen
    12. request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36";
    13. HttpWebResponse res = (HttpWebResponse)request.GetResponse();
    14. Stream streamResponse = res.GetResponseStream();
    15. using (StreamReader sr = new StreamReader(streamResponse))
    16. {
    17. richTextBox1.Text = sr.ReadToEnd();
    18. }
    19. }
    20. private void button2_Click(object sender, EventArgs e)
    21. {
    22. HttpWebRequest request = (HttpWebRequest)WebRequest.Create(LoginUrl);
    23. request.Method = "POST";
    24. request.Accept = "*/*";
    25. request.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";
    26. request.CookieContainer = cc;
    27. request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36";
    28. String postData = "username=&action=login&password=&useCookies=1&submitButton=Anmelden&url=https%3A%2F%2Fwww.vb-paradise.de%2F&t=" + textBox1.Text;
    29. Byte[] data = Encoding.ASCII.GetBytes(postData);
    30. request.ContentLength = data.Length;
    31. using (Stream s = request.GetRequestStream())
    32. {
    33. s.Write(data, 0, data.Length);
    34. }
    35. richTextBox1.Text = "";
    36. HttpWebResponse res = (HttpWebResponse)request.GetResponse();
    37. request = (HttpWebRequest)WebRequest.Create(baseUrl);
    38. request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36";
    39. request.CookieContainer = cc;
    40. res = (HttpWebResponse)request.GetResponse();
    41. Stream streamResponse = res.GetResponseStream();
    42. using (StreamReader sr = new StreamReader(streamResponse))
    43. {
    44. richTextBox1.Text = sr.ReadToEnd();
    45. }
    46. }
    47. }[/spoiler][spoiler]


    In den String postData musst natürlich deinen Usernamen und Passwort noch iwie einsetzen.
    In der Richtextbox erscheint dann die Seite nach dem Login als Plain Text.

    Das Ganze ist quick n dirty nur zur Veranschaulichung.
    Das ist meine Signatur und sie wird wunderbar sein!