Sicurezza con Asp ….No Grazie!!!

Che le pagine ASP siano oramai superate, lo si sapeva da un pezzo (quante tecnologie molto più all’avanguardia ci sono oramai in giro), che le usino ancora molto, anzi precisiamo, che molte aziende  pur di non spendere soldi, non reingegnerizzano le loro applicazioni l’ho scoperto qualche annetto fa, ma che la tecnologia ASP sia così penetrabile non lo sapevo affatto.

Forse questo è accaduto per il semplice motivo che io non mai avuto a che fare con ASP, ma dal momento che per lavoro mi sono dovuto imbattere in applicazioni che interagiscono con pagine ASP ho scoperto una cosa che m’ha fatto rimanere allibito.

< ----   Scenario ------ >

Ho una mia applicazione (una toolbar di Internet Explorer) che automatizza alcune richieste di pagamento. La cosa simpatica è che questi pagamenti non vengono salvati su un database di proprietà dell’azienda presso cui lavoro, ne attraverso un’applicazione loro, ma su un applicazione ed un db di un'altra azienda, che, ovviamente, non fornisce il codice (giustamente), ma che nemmeno vuole mettere mano alle sue applicazioni per fornirci un punto d’accesso, magari un web service…no! NIENTE!

Da ciò s’è pensato che la toolbar non può far altro, per automatizzare il tutto, se non scrivere le informazioni nelle Textbox o selezionare i ValueMember delle ComboBox al posto dell’utente.

Benissimo si usa l’oggetto WebBrowser del framework .NET e si aggiunge un riferimento alla dll usata per il collegamento alle pagine web e il loro codice HTML in Internet Explorer (mshtml) e il gioco è fatto.

Ora nasce un nuovo problema…Si vuole fornire una nuova funzionalità alla toolbar, si vuole dare la possibilità all’utilizzatore che liquida le istanze di pagamento, di poterle liquidare con un solo click dalla toolbar (quelli già non fanno nulla, mo ci mettiamo anche ad automatizzare il loro lavoro…ma che ci stanno a fare allora??? :D Scherzo, sono importanti…Appunto …Scherzo) , premettiamo che per farlo manualmente bisogna:

1)      cliccare un pulsante in un iframe della pagina contenuto in frame (uno dei tanti presenti nella pagina), questo click crea una row in una table che a guardare l’html è vuota…ma in realta ha al suo interno 4 textbox, una label, e due button

2)      cliccare su uno dei due button, che apre un pop up modale

3)      selezionare un valore da una comboBox

4)      cliccare un altro button

5)      spuntare una checkbox

6)      e cliccare su di un pulsante conferma

Mammamia!!! CHE FATICA!!!

Vabbè automatizziamo tutto?!?! Prima cosa avverto i responsabili che ci provo :D non sapevo fosse fattibile, e gli dico che se ci riesco mi blocco quasi sicuramente al punto due…addirittura beccare i tag di un popup da un applicazione che funziona in una singola tab di Internet Explorer mi sa che la vedo brutta.

Sursum corda… proviamoci!!

< ---- Soluzione ---- >

Istruzioni punto 1

Vediamo un po l’html della pagina

…..

<frameset id="fsTop" …..="">

            …. …..

      <frame border="0" bordercolor="#6699cc" frameborder="no" name="fraTopic"  

       scrolling="auto" src="Main/T0MAXXXX.htm" style="border-left: #99ccff 1px groove;  

       border-top: #003366 1px solid;">

            <html>

             <head>

             ….

             </ head>

             <body>

                <div id="myArea">

                   <iframe id="myFrame" frameborder="0" height="91%"                                 

                     src="T0OSInsLXXXX.asp?Parametri" width="100%">

                         <html>

                          <head>

                            ….

                         </ head>

                         <body>

                            ….

                           <input class="button" name="InsRiga_1" onclick="MiaOperazione('1');"

                           style="width: 150px; height: 20px;" type="button" value="Inserisci Dettaglio" />

                            ….

                        < /body>

                        </ html>

                     </ iframe>

                  </ div>

               </ body>

             </ html>        

            </ frame>

            …..

            ….

</ frameset>

Per il primo step bisogna riuscire a fare il click del button InsRiga_1. Vediamo come…

private void clickButton(string nomeButton, string type, string NomeFrame)

        {

          //Documento Html fa parte delle classi di mshtml

          HTMLDocumentClass doc;

          //Explorer è un oggetto della classe WebBrowser contenente la pagina

          // visualizzata nel browser

          doc = (HTMLDocumentClass)Explorer.Document;

          //Prendo tutti i frame nella pagina e li ciclo per cercare quello in cui è contenuto il mio button

           FramesCollection frames = doc.frames;

            for (int i = 0; i < frames.length; i++)

            {

            //il codice Html del frame grazie ad un cast esplicito lo metto in

            //un oggetto della classe HtmlDocument di mshtml

             object refIdx = i;

             IHTMLWindow2 frame = (IHTMLWindow2)frames.item(ref refIdx);

             HTMLDocument frameDoc = (HTMLDocument)frame.document;

            //controllo se sono nel frame corretto…quello dove è contenuto

            //l’iframe contenente il mio button da cliccare

             if (((mshtml.HTMLWindow2Class)frameDoc.Script).name == NomeFrame)

               {

            //prendo tutti gli iframe che ci sono nel frame (ce ne sta uno 

            //solo nel mio caso)

                 IHTMLElementCollection iframes =       

                (IHTMLElementCollection)frameDoc.getElementsByTagName("iframe");            

                foreach (IHTMLElement iframe in iframes)

                 {

            //prendo tutti i pulsanti che hanno il nome come quello che mi cerco

            //e anche in questo caso ce n’è uno solo :D

            //Nella riga di codice seguente c’è riassunto cio che poteva essere

            //fatto in più righe di codice…sinceramente ho preferito fare cast 

            //su cast anzicchè scrivere dieci righe di codice e dichiarare

            //altrettante variabili

                  IHTMLElementCollection buttons =          

                  (IHTMLElementCollection)((HTMLDocument)((HTMLIFrame)  

                  iframe).contentWindow.document).getElementsByName(nomeButton);

                 }

             //clicco i pulsanti...nel mio caso continua ad essere uno solo

                 foreach (IHTMLInputElement button in buttons)

                 {

                  ((IHTMLElement)button1).click;

                 }

 

                }

                          }

         } 

Da richiamare con questa riga di codice

clickButton("InsRiga_1", "button", "fraTopic");

Sulla pagina web  accade questo

Prima

clip_image002

Dopo

clip_image004  

Guardo il codice Html e diventa questo…

…..

<frameset id="fsTop" …..="">

            …. …..

      <frame border="0" bordercolor="#6699cc" frameborder="no" name="fraTopic"  

       scrolling="auto" src="Main/T0MAXXXX.htm" style="border-left: #99ccff 1px groove; 

       border-top: #003366 1px solid;">

            <html>

             <head>

             ….

             </ head>

             <body>

                <div id="myArea">

                   <iframe id="myFrame" frameborder="0" height="91%"                                 

                     src="T0OSInsLXXXX.asp?Parametri" width="100%">

                         <html>

                          <head>

                            ….

                         </ head>

                         <body>

                            ….

                           <input class="button" name="InsRiga_1" onclick="MiaOperazione('1');"

                           style="width: 150px; height: 20px;" type="button" value="Inserisci Dettaglio" />

                        <table width="90%" align="center" id="TBL_RITENUTE" border="1"                

                        cellSpacing="2" cellPadding="2">

                            </tbody >

                        </table >

                            ….

                        < /body>

                        </ html>

                     </ iframe>

                  </ div>

               </ body>

             </ html>        

            </ frame>

            …..

            ….

</ frameset>

Uguale ma c’è in più una table vuota…non ci posso credere… sullo schermo è piena, cosi mi faccio aiutare dal tool per lo sviluppo di internet explorer (ho IE8 altrimenti con il cavolo che l’avrei visto :D)

Recupero da li tutti i nomi dei controlli per i quali si devo settare i valori tramite i passi dal 2 al 6…Pensandoci però dico a me stesso…”Perché fare tutto sto giro per poter inserire dei valori in textbox o in combo…prendo il codice html come fatto in precedenza e gli setto il value a mano :D

Istruzioni punti 2 a 6

private void writeInputTag(string value, string NomeFrame, string nomeInput)

 {

  //Documento Html fa parte delle classi di mshtml

  HTMLDocumentClass doc;

  //Explorer è un oggetto della classe WebBrowser contenente la pagina

  // visualizzata nel browser

  doc = (HTMLDocumentClass)Explorer.Document;

  //Prendo tutti i frame nella pagina e li ciclo per cercare quello in           

  //cui è contenuto il mio button

  FramesCollection frames = doc.frames;

  for (int i = 0; i < frames.length; i++)

   {

    //il codice Html del frame grazie ad un cast esplicito lo metto in

   //un oggetto della classe HtmlDocument di mshtml

    object refIdx = i;

    IHTMLWindow2 frame = (IHTMLWindow2)frames.item(ref refIdx);

    HTMLDocument frameDoc = (HTMLDocument)frame.document;

   //controllo se sono nel frame corretto…quello dove è contenuto

   //l’iframe contenente il mio button da cliccare

   if (((mshtml.HTMLWindow2Class)frameDoc.Script).name == NomeFrame)

    {

    //prendo tutti gli iframe che ci sono nel frame (ce ne sta uno 

   //solo nel mio caso)

     IHTMLElementCollection iframes =       

     (IHTMLElementCollection)frameDoc.getElementsByTagName("iframe");            

     foreach (IHTMLElement iframe in iframes)

      {

   //recupero i tbodies dell’ elemento TBL_RITENUTE (ce ne sta uno 

   //solo nel mio caso)

       IHTMLElementCollection tables = 

      ((IHTMLElementCollection)((((IHTMLTable)((HTMLDocument)((HTMLIFrame)

     iframe).contentWindow.document).getElementById("TBL_RITENUTE"))).tBodies));

      }

    //recupero i controlli che hanno il name come quello che cerco(ce ne sta uno 

    //solo nel mio caso)

     foreach (IHTMLElement table in tables)

      {

       controls = ((HTMLDocument)table.document).getElementsByName(nomeInput);

      }

    //gli setto il value

     foreach (IHTMLInputElement control in controls)

      {

       control.value = value;

      }

    }

  }

}

 

E il gioco è fatto…sulla pagina web guardate un po’ cosa è successo???

clip_image006

Beh che dire??? La conclusione è…

Menomale che ASP c’è!!!!!

Published 9 giu 2010 11:27 da Giorgio
Inserito sotto:
Powered by Community Server (Commercial Edition), by Telligent Systems