Archivio per la categoria ‘Sviluppo Web’

  • Risolvere l’Errore “Could not find control ‘xxx’ in ControlParameter ‘xxx’”

    11 settembre 2007 | Sviluppo Web | Nessun Commento.

    Prendiamo, per esempio, questo codice:

    <asp:DetailsView ID="DetailsView1" runat="server"
    AutoGenerateRows="false" DataSourceID="SqlDataSource1">
       <Fields>
          <asp:BoundField DataField="ID" />
          <asp:TemplateField>
             <EditItemTemplate>
                <asp:TextBox ID="TextBox1" runat="server"
                   Text='<%# (string)Eval("Nome") %>' />
             </EditItemTemplate>
           </asp:TemplateField>
       </Fields>
    </asp:DetailsView>
    <asp:SqlDataSource ID="SqlDataSource1" runat="server"
    SelectCommand="SELECT ID, Nome FROM TabellaDiProva WHERE ID = @ID"
    UpdateCommand="UPDATE TabellaDiProva SET Nome = @Nome WHERE ID = @ID">
       <SelectParameters>
          <asp:QueryStringParameter Name="ID"
             QueryStringField="id" />
       </SelectParameters>
       <UpdateParameters>
          <asp:QueryStringParameter Name="ID"
             QueryStringField="id" />
          <asp:ControlParameter Name="Nome"
             ControlID="TextBox1" />
       </UpdateParameters>
     </asp:SqlDataSource>
    

    Niente di eccezionale, un controllo DetailsView con un SqlDataSource associato. Questo codice però vi restituirà il seguente errore: "Could not find control ‘TextBox1′ in ControlParameter ‘Nome’.".
    Continua a leggere »

  • Un Blog con ASP.Net e SQLite, Seconda Parte

    9 settembre 2007 | Sviluppo Web | Nessun Commento.
    Questo tutorial è diviso in tre parti distinte:

    Nell’intervento precedente ho trattato la creazione del database che utilizzeremo per memorizzare gli interventi del blog. Vedremo ora come realizzare la pagina di amministrazione, che consentirà all’autore di inserire gli interventi e le rispettive categorie.
    Il login verrà gestito attraverso un Membership Provider specifico per SQLite.

    Clicca qui per scaricare il progetto realizzato fino a questo punto!

    Aggiunta dei file per Membership e Roles Provider

    Le classi necessarie alla gestione dell’autenticazione sono MSQLiteRoleProvider.cs e MSQLiteMembershipProvider.cs e si trovano all’interno del progetto di esempio disponibile per il download in questa stessa pagina, oppure possono essere scaricate da qui.
    Il files vanno posizionati nella cartella App_Code del sito. Per maggiori informazioni: Membership & Role Provider per database SQLite

    Il file Web.config

    Prima di iniziare la vera e propria costruzione della pagina di amministrazione, è necessario specificare alcune impostazioni nel file di configurazione. In particolare dobbiamo:

    • Aggiungere una stringa di connessione al database:
        <connectionStrings>
          <add connectionString="Data Source=|DataDirectory|blog.db;"
              name="ExampleBlogConnString"
              providerName="System.Data.SQLite"/>
        </connectionStrings>
      

      Notate l’uso della parola chiave |DataDirectory|, che indica il percorso alla cartella App_Data del sito.

    • Forzare il login basato su Forms:
      <authentication mode="Forms"/>
      
    • Impostare i providers di autenticazione:
         <membership defaultProvider="MSQLiteMembershipProvider"
              userIsOnlineTimeWindow="30">
      <providers>
              <clear/>
              <add name="MSQLiteMembershipProvider"
                  type="Minifloppy.it.Providers.MSQLiteMembershipProvider"
                  connectionStringName="ExampleBlogConnString"
                  applicationName="ExampleBlog"
                  enablePasswordRetrieval="false"
                  enablePasswordReset="true"
                  requiresQuestionAndAnswer="true"
                  requiresUniqueEmail="true"
                  passwordFormat="Hashed"
                  writeExceptionsToEventLog="true"/>
            </providers>
          </membership>
      
          <roleManager defaultProvider="MSQLiteRoleProvider"
              enabled="true"
              cacheRolesInCookie="true"
              cookieName=".ASPROLES"
              cookieTimeout="30"
              cookiePath="/"
              cookieRequireSSL="false"
              cookieSlidingExpiration="true"
              cookieProtection="All">
      <providers>
              <clear/>
              <add name="MSQLiteRoleProvider"
                  type="Minifloppy.it.Providers.MSQLiteRoleProvider"
                  connectionStringName="ExampleBlogConnString"
                  applicationName="ExampleBlog"
                  writeExceptionsToEventLog="true" />
            </providers>
          </roleManager>
      

    Continua a leggere »

  • Un Blog con ASP.Net e SQLite, Prima Parte

    22 agosto 2007 | Sviluppo Web | Nessun Commento.

    Questo tutorial è diviso in tre parti distinte:

    SQLite (http://www.sqlite.org) è un motore di database open source che, sebbene poco conosciuto e spesso sottovalutato, vanta alcune caratteristiche uniche:

    • il database è interamente contenuto in un singolo file e non richiede quindi alcuna installazione, oltre ad essere indipendente dal sistema operativo utilizzato. Per chi ha il proprio sito in hosting è una scelta economica e di immediata realizzazione;
    • è più veloce di altri database (ad es. MySql);
    • sono disponibili implementazioni per diversi linguaggi tra cui C, PHP e ASP.Net.

    In particolare per ASP.Net mi sono trovato molto bene con la libreria System.Data.SQLite (open source anch’essa e reperibile qui: http://sqlite.phxsoftware.com). Questa libreria implementa completamente il modello dati di ADO.Net e fornisce supporto anche all’interno di Visual Studio (o Visual Web Developer Express, che utilizzerò in questi interventi) in fase di Design.

    Il progetto di esempio che realizzeremo è molto semplice e si compone di due pagine: default.aspx, che mostra gli interventi, e admin.aspx, che ne permette invece l’inserimento.
    Continua a leggere »

  • Aggiornare File XML con ASP: Introduzione

    1 giugno 2007 | Sviluppo Web | 2 Commenti

    Aggiornare file XML tramite ASP è un’operazione molto semplice. L’oggetto necessario per svolgere il compito è, come d’abitudine, il MSXML2.DOMDocument.4.0. Per quanto riguarda i metodi da utilizzare dobbiamo fare una distinzione fra quelli che riguardano l’aggiornamento e quelli che riguardano invece l’aggiunta di nuovi nodi.

    Nota: il codice XML che utilizzerò per gli esempi di questo articolo è ripreso dall’intervento Accedere ad un File XML con ASP. Per rendere la lettura più semplice riporto comunque il codice:

    <?xml version="1.0" encoding="iso-8859-1"?>
    	<listaprodotti>
    		<prodotto id="1" nome="Sum41 - Does this look infected">Ultimo album del famoso gruppo punk-rock</prodotto>
    		<prodotto id="2" nome="Iron Maiden - The best of the beast">Album fantastico!</prodotto>
    </listaprodotti>
    

    Aggiornamento di nodi o attributi già esistenti

    E’ relativamente semplice aggiornare un file XML. Il metodo più pratico è riportato nel listato seguente:

    <%
    'Oggetto XML
    Set objXML = Server.CreateObject("Msxml2.DOMDocument.4.0")
    
    'Carico i dati XML
    objXML.async = False
    objXML.load(Server.MapPath("esempio.xml"))
    
    'Procedo all'aggiornamento
    set objData = objXML.selectSingleNode("listaprodotti/prodotto[@id='1']")
    objData.Text = "Testo del nodo aggiornato...... w minifloppy.it!"
    set objData = nothing
    
    objXML.Save(Server.MapPath("esempio.xml"))
    
    'Pulizia
    Set objXML = nothing
    %>
    

    Continua a leggere »

  • Una Pagina Conta Click con ASP e XML

    16 maggio 2007 | Sviluppo Web | Nessun Commento.

    Qualche giorno fa Andrea, un lettore che ringrazio per lo spunto che mi ha fornito per questo intervento, mi ha scritto per chiedermi qualche consiglio nella realizzazione di una pagina "contaclick".

    Lo scopo di una pagina del genere potrebbe essere quello di monitorare quanti utenti di un sito navigano verso una pagina esterna.

    La soluzione più semplice per la realizzazione di un sistema del genere in ASP è sicuramente quella di utilizzare un file XML per memorizzare i link e il numero di click ad essi associato:

    <?xml version="1.0" ?>
    <links>
        <link id="l0" click="0">http://www.minifloppy.it</link>
    </links>
    

    Continua a leggere »

  • Accedere ad un File XML con ASP

    14 maggio 2007 | Sviluppo Web | 2 Commenti

    Di seguito è riportato il codice XML che userò anche in futuro, nel corso di altri articoli:

    <?xml version="1.0" encoding="iso-8859-1"?>
    	<listaprodotti>
    		<prodotto id="1" nome="Sum41 - Does this look infected">Ultimo album del famoso gruppo punk-rock</prodotto>
    		<prodotto id="2" nome="Iron Maiden - The best of the beast">Album fantastico!</prodotto>
    </listaprodotti>
    

    La struttura come potete vedere è molto semplice e consiste nell’elemento radice “listaprodotti” e nei due elementi figli “prodotto”. Questi ultimi hanno tre attributi: “id”, “nome” e “descrizione”.
    Continua a leggere »

  • Sql Injection

    28 aprile 2007 | Sviluppo Web | Nessun Commento.

    SQL Injection: cos’è?

    In generale il sql injection è una tattica con cui un malintenzionato riesce ad eseguire qualsiasi operazione sul database, sia questa di aggiunta, modifica o cancellazione di dati. Se poi l’attaccante agisce su Sql Server, MySql o simili, i pericoli sono ancora maggiori: basti pensare a cosa potrebbe fare una volta acquisiti i permessi di amministratore.

    Come funziona

    Il sql injection prevede l’inserimento di istruzioni sql nella query di interrogazione del database. Per un esempio, basta pensare ad una pagina di login con i due campi nome utente e password. Un malintenzionato può inserire qualsiasi istruzione SQL nel primo campo semplicemente scrivendo: ‘comando. L’apostrofo (’) infatti segna la fine della stringa. Ecco a confronto le due query che potrebbero venire fuori dalla tecnica precedente, la prima è quella corretta, la seconda è quella contraffatta:

    SELECT * FROM utenti WHERE
    nome = 'minifloppy' AND password = 'webmaster'
    
    SELECT * FROM utenti WHERE
    nome = '';query contraffatta--AND password = 'webmaster'
    

    I cracker sono ancora più facilitati se nel form viene richiesto un valore numerico. In questo caso basterebbe semplicemente inserire la query contraffatta.

    Come difendersi

    Le difese possono essere principalmente tre:

    • Cercare di far diventare l’input corretto
    • Non accettare input che è stato riconosciuto come non corretto
    • Accettare solo input corretto

    La prima è decisamente da scartare perchè modificando l’input potremmo incorrere in molti problemi. Primo fra tutti è quello del riconoscere l’input scorretto, soprattutto perchè di input scorretti ne vengono scoperti in ogni momento di nuovi. Secondo la modifica protrebbe alterare la lunghezza ed il contenuto.

    Anche la seconda presenta gli stessi inconvenienti della prima, quindi l’unica utilizzabile in modo sicuro è la terza. Di seguito è riportato un esempio pratico (in ASP) per ogni approccio possibile:

    <%
    'Esempio n.1
    'Facciamo diventare corretto l'input sostituendo l'apostrofo con altri due
    
    function controlla(input)
         input = replace(input, "'", "''")
         controlla = input
    end function
    %>
    
    <%
    'Esempio n.2
    'Controlliamo che l'input sia corretto
    function controlla2(input)
         aScorretto = array( "select", "insert", "update", "delete", "drop",
    "--", "'" )
         controlla2 = true
    
         for i = lbound(aScorretto) to ubound(aScorretto)
    
              if ( instr( 1, input, aScorretto(i), vbtextcompare ) <> 0 )
    then
                   controlla2 = false
                   exit function
              end if
    
         next
    
    end function
    %>
    
    <%
    'Esempio n.3
    'Accettiamo solo l'input corretto
    function controlla3(input)
         strChars =
    "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
         controlla3 = true
    
         for i = 1 to len(input)
              c = mid( input, i, 1 )
    
              if ( InStr( strChars, c ) = 0 ) then
                   controlla3 = false
                   exit function
              end if
    
         next
    end function
    %>
    

    Conclusioni

    Come abbiamo visto validare gli input è molto importante, pena database in pericolo. Eseguire controlli non significa quindi sprecare tempo e risorse, ma rendere la nostra applicazione più affidabile e sicura.