Avatar billede zapzone Nybegynder
14. oktober 2007 - 22:45 Der er 15 kommentarer og
1 løsning

Læse HTML fra password beskyttet side

Hej Eksperter,

Jeg vil gerne kunne læse HTML koden for en .php side. Problemet er, at for at komme ind på siden skal der indtastes username/password, hvilket jeg har, men når mit program læser HTML'en, så får jeg den html kode som man ville få hvis man selv kopierede linket direkte ind i browseren uden at være logged ind. F.eks. her:
http://speed.travian.dk/dorf1.php

Selvom jeg sætter Credentials med username og password, så lader det ikke til at have nogen effekt... Gør jeg noget galt ?

Sådan set mit program ud indtil videre:

----------------------------------
WebRequest req;
string url = String.Empty;
string pictureLink = String.Empty;
Stream dataStream;
StreamReader reader;
string responseFromServer;
HttpWebResponse resp;

url = "http://speed.travian.dk/dorf1.php";

req = WebRequest.Create(url);
req.Credentials = new NetworkCredential("user","passwd");
resp = (HttpWebResponse)req.GetResponse();
dataStream = resp.GetResponseStream();
reader = new StreamReader(dataStream);
responseFromServer = reader.ReadToEnd();

Debug.WriteLine(responseFromServer);
----------------------------------
Avatar billede arne_v Ekspert
14. oktober 2007 - 22:59 #1
Hvis der bruges HTTP BASIC authentication så bør dit approach:
  sende un & pw credentials med request
virke.

Men hvis der bruges form based authentication, så skal du:
  bruge den samme cookie container for all requests
  først sende en POST med un & pw til login
  så sende en GET efter den side du vil have
Avatar billede zapzone Nybegynder
14. oktober 2007 - 23:08 #2
Ok, det er jo klart. Den kode jeg har er baseret på http basic authentication, men siden  bruger form based auth.

Er ikke helt med på hvad du mener med at jeg skal bruge den "samme cookie container for all requests" ??

Sende en POST med un & pw til login ? Hvordan ?
Avatar billede arne_v Ekspert
14. oktober 2007 - 23:45 #3
Simpelt eksempel med 2 x GET:

using System;
using System.IO;
using System.Net;

namespace E
{
    public class MainClass
    {
        public static string GetContent(string url, CookieContainer session)
        {
            HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(url);
            wr.CookieContainer = session;           
            string html = (new StreamReader(wr.GetResponse().GetResponseStream())).ReadToEnd();
            return html;
        }
        public static void Main(string[] args)
        {
            CookieContainer session = new CookieContainer();
            string login = GetContent("http://localhost:8080/logintest/login.jsp?username=arne&password=hemmeligt", session);
            Console.WriteLine(login);
            string other = GetContent("http://localhost:8080/logintest/other.jsp", session);
            Console.WriteLine(other);
        }
    }
}
Avatar billede arne_v Ekspert
14. oktober 2007 - 23:48 #4
En POST snippet:

            HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
            req.Method = "POST";
            req.ContentType = "application/x-www-form-urlencoded";
            StreamWriter post = new StreamWriter(req.GetRequestStream());
            post.Write("ec5467b=ditbrugernavn&e7b370c=ditpassword");
            post.Close();
            HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
            StreamReader sr = new StreamReader(resp.GetResponseStream());
Avatar billede zapzone Nybegynder
14. oktober 2007 - 23:56 #5
På forhånd tak :)
Er nødt til at hoppe under dynen nu, men tester det lige af i morgen ;)
Avatar billede zapzone Nybegynder
15. oktober 2007 - 20:55 #6
Det lader ikke umiddelbart til at virke...

Det eneste jeg sådan set har gjort er at ændre url'erne, samt modificere post.Write() metoden:

Fra:

  post.Write("ec5467b=ditbrugernavn&e7b370c=ditpassword");

Til:

  post.Write("ef2cae3=ditbrugernavn&e8e1b2b=ditpassword");

De nye værdier (ef2cae3 og e8e1b2b) fik jeg fra login sidens source:

<tr><td><label>Navn:</label>
<input class="fm fm110" type="text" name="ef2cae3" value="" maxlength="15"> <span class="e f7"></span>
</td></tr>
<tr><td><label>Kodeord:</label>
<input class="fm fm110" type="password" name="e8e1b2b" value="" maxlength="20"> <span class="e f7"></span>

Jeg går udfra det var meningen at disse to skulle ændres ? Jeg prøvede også med de værdier som du havde i eksemplet, men stadig ingen held.

Her er min C# kode:
-------------------------
namespace WindowsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Post();

            CookieContainer session = new CookieContainer();
            string login = GetContent("http://speed.travian.dk/dorf1.php", session);
            Debug.WriteLine(login);
        }

        private static void Post()
        {
            HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://speed.travian.dk/dorf1.php");
            req.Method = "POST";
            req.ContentType = "application/x-www-form-urlencoded";
            StreamWriter post = new StreamWriter(req.GetRequestStream());
            post.Write("ef2cae3=mitLogin&e8e1b2b=mitPassword");
            post.Close();
            HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
            StreamReader sr = new StreamReader(resp.GetResponseStream());
        }

        public static string GetContent(string url, CookieContainer session)
        {
            HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(url);
            wr.CookieContainer = session;
            string html = (new StreamReader(wr.GetResponse().GetResponseStream())).ReadToEnd();

            return html;
        }

       
    }
}

Det som returneres fra GetContent() metoden er blot html koden fra login siden, hvor det istedet gerne skulle have været html'en fra: http://speed.travian.dk/dorf1.php

Nogen idéer til hvad der går galt ?
Avatar billede zapzone Nybegynder
20. oktober 2007 - 17:03 #7
Ingen der har et bud på hvad der går galt ?
Avatar billede nielle Nybegynder
20. oktober 2007 - 17:09 #8
Er du sikker på at de der to login-oplysninger ikke ændre sig fra gang til gang? De kunne godt se lidt sådan ud.
Avatar billede arne_v Ekspert
20. oktober 2007 - 17:46 #9
Login siden skal nok hentes med GET, felt navnene hentes ud med noget regex og så
konstruere POST udfra det.
Avatar billede zapzone Nybegynder
20. oktober 2007 - 22:04 #10
nielle >> Nej, det er ikke det... Login oplysningerne er de samme hver gang.

Hmm arne v, kan ikke lige lure hvor du vil hen ?
Hvad mener du med at Login siden skal hentes med GET ?
Lige nu hentes den vel med GetContent(), ikke ?

string login = GetContent("http://speed.travian.dk/dorf1.php", session);

Kan du specificere ?
Avatar billede arne_v Ekspert
20. oktober 2007 - 23:04 #11
Nu hedder det:

<input class="fm fm110" type="text" name="ed1ad83" value="" maxlength="15">
<input class="fm fm110" type="password" name="ea64e35" value="" maxlength="20">

Jeg tror ikke at de kan lide robot signon.
Avatar billede arne_v Ekspert
20. oktober 2007 - 23:05 #12
Det jeg forslår er:

1) en GET af siden
2) brug regex til at fiske de fletnavne ud med
3) en POST af login (husk de 2 skjulte felter !!)
4) GET af det du skal bruge
Avatar billede zapzone Nybegynder
21. oktober 2007 - 02:19 #13
Hmm... Har fået fisket feltnavnene ud, men umiddelbart stadig ikke få hul igennem... Hvad mener du med "de 2 skjulte felter" ?

Lige nu er det den samme kode, bortset fra at login og password felt-navnene bliver hentet fra gang til gang. Så lige nu ser min Post() metode således ud:

-----------------------------------

private static void Post()
        {
            string loginField = Service.GetLoginFieldName();
            string passwdField = Service.GetPasswdFieldName();

            HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://speed.travian.dk/");
            req.Method = "POST";
            req.ContentType = "application/x-www-form-urlencoded";
            StreamWriter post = new StreamWriter(req.GetRequestStream());

            post.Write(""+loginField+"=USERNAME&"+passwdField+"PASSWORD");

            post.Close();
            HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
            StreamReader sr = new StreamReader(resp.GetResponseStream());
            Debug.WriteLine(sr.ToString());
        }
Avatar billede arne_v Ekspert
21. oktober 2007 - 04:18 #14
<form method="post" name="snd" action="dorf1.php">
<input type="hidden" name="w" value="">                <---------------
<input type="hidden" name="login" value="1192933103">  <---------------
Avatar billede zapzone Nybegynder
21. oktober 2007 - 13:24 #15
Ja ok... Men hvorfra ved jeg hvad jeg skal gøre ved dem ?
Avatar billede zapzone Nybegynder
30. november 2007 - 15:25 #16
Lukket... Fandt ingen løsning :/
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester