IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET Discussion :

Sécurité et WebClient.DownloadString


Sujet :

ASP.NET

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2011
    Messages : 4
    Par défaut Sécurité et WebClient.DownloadString
    Bonjour,

    Je rencontre actuellement un problème lors de l'utilisation de l'objet WebClient.
    Je me connecte à un site tierce via une iframe et un petit code javascript permettant de logger mon utilisateur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function LoadDone()
    {
            var frame = document.getElementById("ifrlogin");
            frame.contentDocument.getElementById("email").value = "xxxxxx@xxxx.com";
            frame.contentDocument.getElementById("password").value = "xxxxx";
            frame.contentDocument.forms[0].submit.click();
        }
    Après vérification, je suis bien loggé automatiquement au site cible.
    J'essaye ensuite de récupérer le contenu d'une page du site cible, qui est bloquée pour les utilisateurs non loggés via

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    WebClient wc = new WebClient();
    String page = wc.DownloadString(contentUrl);
    Mon problème est que le WebClient me renvoie la page visible pour un utilisateur non identifié et non celle d'un utilisateur identifié.

    Je suppose que ceci doit être du au fait qu'il faut que j'embarque dans mon WebClient des informations permettant au site cible de le confondre avec mon navigateur "classique" (qui lui est bien loggé) , mais lesquelles et comment faire ?

  2. #2
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Y'a confusion là!
    Remplir une page dans une iframe, c'est dans le navigateur côté client que ca se passe.
    Ton WebClient, c'est du C# et ca se passe côté serveur!

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2011
    Messages : 4
    Par défaut
    Tout à fait, ma problématique est donc de récupérer le HttpCookie de la page présente dans le iframe, de manière à le passer ensuite à mon WebClient coté serveur.
    Ce qui doit être un mélange javascript/C# au final.

  4. #4
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Ce qui est purement impossible, quelle faille de sécurité autrement!

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2011
    Messages : 4
    Par défaut
    Ok, c'est bien ce que je craignais, j'espérais quand même qu'il existait des méthodes de contournement.

  6. #6
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Cependant, si tu fais tout côté serveur, c'est possible.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2011
    Messages : 4
    Par défaut
    J'ai tout passé coté serveur.
    Du coup, j'ai un nouveau souci (1ère tentative de générer des posts a la volée en C#).

    Voila comment se déroule un échange normal pour obtenir un token de connexion :

    J'envoie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    POST URLRELATIVE HTTP/1.1
    Host: URL
    User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0.1) Gecko/20100101 Firefox/4.0.1
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/ *;q=0.8
    Accept-Language: fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3
    Accept-Encoding: gzip, deflate
    Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
    Keep-Alive: 115
    Connection: keep-alive
    Referer: URL
     
    Contenu :
    Content-Type: application/x-www-form-urlencoded 
    Content-Length: 65 
     
    email=xxxxxxx&password=yyyyy&submit=Login
    Le serveur me répond
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    HTTP/1.1 302 Found
    Date: Fri, 17 Jun 2011 11:36:40 GMT
    Server: Apache
    X-Powered-By: PHP/5.1.6
    Set-Cookie: itemofcookie=9qeq3hspppeqrg81hvl6bmsp62; path=/
    Expires: Thu, 19 Nov 1981 08:52:00 GMT
    Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
    Pragma: no-cache
    Location: URLRELATIVE?itemofcookie=9qeq3hspppeqrg81hvl6bmsp62
    Content-Length: 0
    Connection: close
    Content-Type: text/html; charset=ISO-8859-1
    Puis à l'aide de ce itemofcookie, j'appelle en GET cette page
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    GET URLRELATIVE?itemofcookie=9qeq3hspppeqrg81hvl6bmsp62 HTTP/1.1
    Host: URL
    User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0.1) Gecko/20100101 Firefox/4.0.1
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/ *;q=0.8
    Accept-Language: fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3
    Accept-Encoding: gzip, deflate
    Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
    Keep-Alive: 115
    Connection: keep-alive
    Referer: URL
    Cookie: itemofcookie=9qeq3hspppeqrg81hvl6bmsp62
    Et le serveur me répond
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    HTTP/1.1 200 OK
    Date: Fri, 17 Jun 2011 11:36:40 GMT
    Server: Apache
    X-Powered-By: PHP/5.1.6
    Expires: Mon, 26 Jul 2000 05:00:00 GMT
    Cache-Control: no-cache, must-revalidate
    Pragma: no-cache
    Last-Modified: Fri, 17 Jun 2011 11:36:40GMT
    Set-Cookie: voter2=4dfb3c48bdf3c; expires=Mon, 29-Oct-2012 11:36:40 GMT; path=/
    connectiontoken=9qeq3hspppeqrg81hvl6bmsp62; expires=Tue, 21-Jun-2011 11:36:40 GMT; path=/
    Connection: close
    Transfer-Encoding: chunked
    Content-Type: text/html; charset=ISO-8859-1
    Au final, je reçoit mon connectiontoken pour me balader librement sur le site.

    probleme, dans mon code, la 1ère partie se passe, bien, mais je ne reçoit pas mon connectionToken dans la partie GET.
    Ais-je raté une étape ?

    Voici mon code générant cet échange
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
                Uri totalUri = Url.Contains("://") ? new Uri(Url + UrlLogin) : new Uri("http://" + Url + UrlLogin);
                String parameters = "Content-Type: application/x-www-form-urlencoded \nContent-Length: 65 \n\n" 
                                  + "email=" + HttpUtility.HtmlAttributeEncode(UserName)
                                  + "&password=" + HttpUtility.HtmlAttributeEncode(Password)
                                  + "&submit=Login\n";
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(totalUri);
                request.Method = "POST";
                request.ContentType = "application/x-www-form-urlencoded";
                request.Headers.Clear();
                //request.Headers.Add("Host", "URL");
                request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0.1) Gecko/20100101 Firefox/4.0.1";
                request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*;q=0.8";
                request.Headers.Add("Accept-Language", "fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3");
                request.Headers.Add("Accept-Encoding", "gzip, deflate");
                request.Headers.Add("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7");
                request.Headers.Add("Keep-Alive", "115");
                request.KeepAlive = true;
                //request.Headers.Add("Connection", "keep-alive");
                request.Referer = "URL";
                //request.Headers.Add("Referer", "URL");
                mycookie = Cookies;
                if (mycookie != string.Empty)
                    requestone.Headers.Add("Cookie", mycookie);
                byte[] byteArray = Encoding.ASCII.GetBytes(  parameters );
                request.ContentLength = parameters.Length;
                // Get the request stream.
                Stream dataStream = request.GetRequestStream();
                // Write the data to the request stream.
                dataStream.Write(byteArray, 0, byteArray.Length);
                // Close the Stream object.
                dataStream.Close();
                resp = request.GetResponse();
                cookie = resp.Headers["Set-Cookie"];
                if (cookie != null)
                    Cookies = cookie;
     
                string itemofcookie = String.Empty;
                if (_cookies.ContainsKey("itemofcookie"))
                    itemofcookie = _cookies["itemofcookie"];
                if (itemofcookie != String.Empty)
                {
                    totalUri = Url.Contains("://") ? new Uri(Url + UrlLogin+"?itemofcookie="+itemofcookie) : new Uri("http://" + Url + UrlLogin+"?itemofcookie="+itemofcookie);
                    request = (HttpWebRequest)WebRequest.Create(totalUri);
                    requestone.Method = "GET";
                    requestone.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0.1) Gecko/20100101 Firefox/4.0.1";
                    requestone.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*;q=0.8";
                    requestone.Headers.Add("Accept-Language", "fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3");
                    requestone.Headers.Add("Accept-Encoding", "gzip, deflate");
                    requestone.Headers.Add("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7");
                    requestone.Headers.Add("Keep-Alive", "115");
                    requestone.KeepAlive = true;
                    //request.Headers.Add("Connection", "keep-alive");
                    requestone.Referer = "URL";
                    mycookie = Cookies;
                    if (mycookie != string.Empty)
                        requestone.Headers.Add("Cookie", mycookie);
                    resp = requestone.GetResponse();
                    cookie = resp.Headers["Set-Cookie"];
                    if (cookie != null)
                        Cookies = cookie;
     
    }
    (la gestion des cookies est faite ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
      private static Dictionary<String, String> _cookies;
            public static String Cookies
            {
                get
                { return getCookies(); }
                set
                { SetCookies(value); }
            }
     
            private static String getCookies()
            {
                if (_cookies == null)
                {
                    _cookies = new Dictionary<string, string>();
                    return string.Empty;
                }
                return string.Join(";", _cookies.Select<KeyValuePair<String, String>, String>(x => x.Key + "=" + x.Value).ToArray());      
            }
     
            private static void SetCookies (String cookie)
            {
                foreach (var kvp in cookie.Split(new string[]{"; "},StringSplitOptions.RemoveEmptyEntries))
                {
                    String[] kvpSplitted = kvp.Split(new string[] { "=" }, StringSplitOptions.RemoveEmptyEntries);
                    String key = kvpSplitted[0].Trim();
                    String value = kvpSplitted[1].Trim();
                    if (key == "expires" || key == "path")
                        continue;
     
                    if (_cookies.ContainsKey(key))
                        _cookies[key] = value;
                    else
                        _cookies.Add(key, value);
                }
            }
    Qu'est ce qui empèche le serveur de me retourner mon connectionToken ?
    Merci d'avance.

Discussions similaires

  1. WebClient DownloadString Antivir
    Par Ywnith dans le forum C#
    Réponses: 4
    Dernier message: 12/07/2013, 14h12
  2. WebClient et Sécurité Exception
    Par maitrebn dans le forum Silverlight
    Réponses: 5
    Dernier message: 04/03/2010, 09h59
  3. La Sécurité dans Access
    Par Maxence HUBICHE dans le forum Sondages et Débats
    Réponses: 81
    Dernier message: 24/06/2007, 01h07
  4. [TomCat][sécurité]config fichier web.xml
    Par liomac dans le forum Tomcat et TomEE
    Réponses: 6
    Dernier message: 24/09/2003, 15h46
  5. Pb de sécurité
    Par xtrips dans le forum Débuter
    Réponses: 6
    Dernier message: 16/04/2003, 07h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo