We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 16429
    • 254 Posts
    Per gli aggiornamenti leggere alla fine del post.

    Salve!
    Nota: è necessario vere piena padronanza dello snippet Ditto per poter usare DittoMachine. Leggere la documentazione di Ditt e la documentazione sui suoi parametri prima di continuare a leggere.


    Premessa
    Ho scritto questo snippet per poter gestire un grande catalogo prodotti.
    Siccome volevo permettere agli utenti di leggere le liste dei prodotti in base ai criteri che preferiscono avrei finito per creare un mucchio di pagine contenenti solo delle chiamate allo snippet Ditto.
    Perciò ho preferito scrivere questo snippet per chiamare Ditto in diverse configurazioni passando alla stessa pagina diversi parametri attraverso il GET.


    Presentazione: DittoMachine!
    DittoMachine ti permette di settare qualsiasi parametro di Ditto nell’url (leggere il capitolo "Sicurezza" per ulteriori informazioni), ad esempio
    Esempio con Friendly Urls attivati:
    http://www.example.com/page.html?startID=5&tpl=DittoMachineTpl&sortBy=pagetitle&sortDir=ASC&summarize=5&filter=tvregione,toscana|tvcatvinoit,vinoit&hiddenTVs=regione,catvinoit&emptyText=%3Cli%3ECiao%20ciao%3C/li%3E&displayArchive=0
    
    Esempio senza Friendly Urls:
    http://www.example.com/index.php?id=23startID=5&tpl=DittoMachineTpl&sortBy=pagetitle&sortDir=ASC&summarize=5&filter=tvregione,toscana|tvcatvinoit,vinoit&hiddenTVs=regione,catvinoit&emptyText=%3Cli%3ECiao%20ciao%3C/li%3E&displayArchive=0
    


    Se la pagina contiene DittoMachine et voilà! Ditto viene servito come output. Puoi anche settare un emptyText contenente entità HTML, come nell’esempio. Ricorda di chiamare lo snippet senza cache (ad esempio [!DittoMachine!], NON [[DittoMachine]]) e NON mettere la pagina nella cache.

    Puoi specificare i parametri direttamente nello snippet DittoMachine: essi avranno la precedenza su quelli passati attraverso l’url.
    Utile per risparmiarsi di inserire sempre certi parametri che possono rimanere fissi: "tpl", tutta la serie di "trunc", "displayArchive" e tutti gli altri che vuoi.

    Se un parametro non viene specificato in nessun modo viene utilizzato il default di Ditto.

    Relativamente semplice. Mi raccomando di leggere il capitolo "Sicurezza", dove vengono illustrate restrizioni di sicurezza, alcuni parametri specifici di DittoMachine e qualche informazione di debug.


    Utilizzo
    Avrai bisogno dello snippet Ditto, nella versione almeno 1.0.2, e che sia titolato "Ditto". Scarica DittoMachine_0.1b.txt alla fine di questo post e copiane i contenuti in un nuovo snippet.
    Inserisci [!DittoMachine!] nella pagina (o chunk, o template, o dove vuoi) e setta tutti i parametri che vuoi mantere fissi direttamente nello snippet, esattamente come se li stessi inserendo direttamente in Ditto. Ricorda, i parametri inseriti nella chiamata dello snippet hanno la precedenza su quelli passati attraverso l’url. Setta &secureStartIDs (leggi il prossimo capitolo) per una maggiore sicurezza.
    Poi crea dove vuoi un link alla pagina che contiene lo snippet DittoMachine e aggiungi al link i parametri di Ditto come GET, nella forma "?tpl=Ditto&summarize=3&etc... ", per ottenere l’output di Ditto che vuoi.


    Sicurezza
    Per prevenire l’accesso indesiderato a pagine non pubbliche ci sono alcune cose che devi sapere. Le presento una ad una:

    • Non puoi settare &seeThroughtUnpub, &showInMenuOnly, &showPublishedOnly, &start attraverso l’url.
      Troppo insicuro. Se hai bisogno di settarlo fallo nella chiamata [!DittoMachine!]. Volendo puoi abilitare questa cosa togliendo il simbolo di commento (#) nel codice dello snippet. Non ti consiglio di farlo.
    • [li]Puoi limitare gli &startID con &secureStartIDs.
      Per prevenire che qualcuno setti uno &startID diverso e veda pagine che noi non vogliamo puoi settare nella chiamata a DittoMachine una lista di ID consentiti come &startID. Se qualcuno inserise un url ad esempio
    http://www.example.com/page.html?startID=5
    

    e la nostra chiamata DittoMachine è
    [!DittoMachine? &secureStartIDs=`4,5,17`!]
    

    verrà consentito di eseguire Ditto con &startID=5 perché "5" è uno degli ID permessi (id 4, id 5, id 17 nell’esempio), separati solo da una virgola (,). Nel caso startID non sia tra quelli permessi l’output sarà "Invalid ID". (Nota per me: migliorare l’output degli errori nella prossima versione)
    Attenzione! DittoMachine accetterà qualsiasi &startID se non setti nessun &secureStartIDs!
    • Non puoi abilitare il &debug di Ditto attraverso l’Url.
      Troppe informazioni. Se vuoi il debug di Ditto, settalo nella chiamata a DittoMachine. Se assolutamente lo vuoi tramite Url, togli il commento alle linee nel codice dello snippet.
    • Puoi settare &dbg nella chiamata allo snippet per ottenere infrmazioni di debug da DittoMachine.
      Questo ti mostrerà la lista dei parametri passati a Ditto da DittoMachine. Utile per vedere quello che Ditto vede.
    • [li]Osserva il codice: commenta via quello che non vuoi.
      Il codice che permette di passare parametri attaverso l’indirizzo è molto semplice: 5 righe per la maggior parte di essi.
      Sono tutti simili (con alcune eccezioni per quelli che necessitano ulteriori controlli), con questa struttura:
    if (isset($emptyText)) {
    		$params['emptyText'] = $emptyText;
    	} else if (isset($_GET['emptyText'])) {
    		$params['emptyText'] = $_GET['emptyText'];
    }
    

    Se volete impedire i settaggio di un dato parametro tramite url basta "commentare via" (con un # all’inizio della linea) le parti che lo permettono. Usando il precedente esempio il codice diventerà:
    if (isset($emptyText)) {
    		$params['emptyText'] = $emptyText;
    #	} else if (isset($_GET['emptyText'])) {
    #		$params['emptyText'] = $_GET['emptyText'];
    }
    


    Conclusioni
    Apprezzerei feedback su 2 cose: primo, avrò sicuramente scritto codice ridondante. Questi sono i miei primi passi nel Php, non ci credo di non aver fatto nemmeno un errore perciò... se pensiate ci siano errori o semplificazioni. Devo imparare.
    Secondo, vorrei sapere cosa ne pensate riguardo alla sicurezza di questo snippet. Avevo il dubbio di aver tralasciato qualcosa in sicuezza, er questo l’ho postato come beta prima che nel Repository.
    Beh, qualsiasi tipo di feedback verrà apprezzato grin

    Spero lo troviate utile.


    Potete scaricare o snippet da questo topic.

    Aggiornamenti
    14/08/06
    _ Aggiunti dei controlli is_numeric() sui parametri numerici (multiLevel, paginate, etc).
    _ Aggiunti dei controlli ereg() sui parametri contenenti stringhe per invalidarle se contengono simboli (tranne pipes, virgole etc)

    In allegato la versione 0.2beta - gradito altro feedback!
      kudo
      www.kudolink.com - webdesign (surprised?)

      [img]http://www.kudolink.com/kudolinkcom.png[/img] [sup]proudly uses[/sup] [img]http://www.kudolink.com/modx.png[/img]
      • 15896
      • 80 Posts
      L’ho letto velocemente, non l’ho provato, non ho compreso a fondo tutte le funzionalità, quindi ti faccio un appunto di primo achito. Per questioni di sicurezza...
      perchè hai usato GET invece di usare POST?

      POST non ti creava tutte le problematiche relative alla sicurezza che ti crea GET.
      GET ha un limite fisico di 2000 caratteri circa che può trasportare, mentre POST no. Certo che ce ne vuole ad arrivare 2000 caratteri, ma qualcuno potrebbe anche richiedere a Ditto di impostare decine e decine di filtri ed arrivarci. Ipotesi un po’ assurda e remota, lo so. Ma rimane sempre meglio POST per trasportare una lunga serie di dati.

      E poi, la questione sicurezza...
      come scelta la capisco poco...
        • 16429
        • 254 Posts
        Ho utilizzato GET invece di POST perché è più facile creare link che creare form. Non dovrebbe essere difficile da modificare per far funzionare tutto con POST per chi è capace e preferisce usare POST.

        Per i resto tutto ciò che ho messo come sicurezza è modificabile in maniera molto semplice, inoltre presettando i parametri nella chiamata a DittoMachine puoi controllare l’output come preferisci. Se vuoi vederlo in azione puoi andare alla pagina test.kudolink.com/listeprodotti.html e giocare con i parametri, o usare i link a destra.

        A me è veramente molto utile!
          kudo
          www.kudolink.com - webdesign (surprised?)

          [img]http://www.kudolink.com/kudolinkcom.png[/img] [sup]proudly uses[/sup] [img]http://www.kudolink.com/modx.png[/img]
          • 15896
          • 80 Posts
          Non metto in discussione l’utilità e lo testerò appena ho un attimo di tempo, ma solitamente io preferisco non fare mai viaggiare i parametri delle mie applicazioni tramite GET, proprio per non farli vedere. Non si sa mai quello che un cracker riesce a fare vedendo quei parametri.
          Scusami se non sono d’accordo, ma implementare un modulo che venga inviato tramite POST è una stupidata. Non è facile creare una query string tramite POST, cosi come si fa con GET questo è vero (neanche cosi difficile a dire il vero), ma fare si che lo script php generi in output un form html con metodo di invio POST, e poi cicli tutti i parametri da inviare, creando per ogni parametro un <INPUT type="hidden" name="key" value="param"> ed infine invi il form tramite un form.submit() di javascript, non è una cosa complessa. IMHO.

          Per quanto riguarda la sicurezza io non mi sentirei molto tranquillo, per 2 motivi:
          1) fai viaggiare i dati in GET e quindi sono visualizzabili
          2) non effettui del text sanitizing. Non devi solo controllare che le variabili esistano (isset), ma anche che non contengano sequenze di caratteri tali da permettere inserimento di codice arbitrario. Devi controllare che nelle stringhe non siano presenti caratteri come ’, ;0 \ e via dicendo, sono l’anticamera alle intrusioni di cracker, wannabe ecc ecc.

          Per quanto volevi fare tu, io avrei trovato molto più semplice creare una tabella nel db con i cataloghi dei prodotti. Un modulo di ricerca con campi di filtraggio che ti permette di creare delle query string in POST verso la pagina contenente un tuo snippet personalizzato che non fa altro che interrogare il db e stampare il resulset tramite php con una impaginazione in html.
          L’uso di Ditto mi sembra alquanto una forzatura.

          Comunque, se sei ai primi passi, tutto ben venga.

          Ciao
            • 16429
            • 254 Posts
            Quote from: kimu at Aug 12, 2006, 06:17 PM

            Scusami se non sono d’accordo, ma implementare un modulo che venga inviato tramite POST è una stupidata. Non è facile creare una query string tramite POST, cosi come si fa con GET questo è vero (neanche cosi difficile a dire il vero), ma fare si che lo script php generi in output un form html con metodo di invio POST, e poi cicli tutti i parametri da inviare, creando per ogni parametro un <INPUT type="hidden" name="key" value="param"> ed infine invi il form tramite un form.submit() di javascript, non è una cosa complessa. IMHO.
            Ecco, appunto, arabo per me smiley. Comunque volevo evitare javascript.
            Quote from: kimu

            Per quanto riguarda la sicurezza io non mi sentirei molto tranquillo, per 2 motivi:
            1) fai viaggiare i dati in GET e quindi sono visualizzabili
            2) non effettui del text sanitizing. Non devi solo controllare che le variabili esistano (isset), ma anche che non contengano sequenze di caratteri tali da permettere inserimento di codice arbitrario. Devi controllare che nelle stringhe non siano presenti caratteri come ’, ;0 \ e via dicendo, sono l’anticamera alle intrusioni di cracker, wannabe ecc ecc.
            1) Nessuno dei dati che posso passare sono interessanti né devo tenere nascosti. Può non essere il caso di altri, ovviamente!
            Inoltre Ditto accetta già alcuni parametri via GET, è questo che mi ha fatto venire l’idea. L’ho solo estesa a tutto il resto dei parametri.
            2) Ecco questo è ciò che intendevo con "feedback sulla sicurezza". Secondo te per mantenere la struttura GET come posso fare ad eseguire questo genere di controlli? Considerando inoltre che la virgola e altri simboli servono per delimitare certe variabili. Sto pensando in questo momento che non ci sia la possibilità di passare script alla pagina, visto che emptyText viene visualizzato correttamente inserendo tag HTML... forse è meglio obbligare a settarlo nella chiamata dello snippet...
            Quote from: kimu

            Per quanto volevi fare tu, io avrei trovato molto più semplice creare una tabella nel db con i cataloghi dei prodotti. Un modulo di ricerca con campi di filtraggio che ti permette di creare delle query string in POST verso la pagina contenente un tuo snippet personalizzato che non fa altro che interrogare il db e stampare il resulset tramite php con una impaginazione in html.
            L’uso di Ditto mi sembra alquanto una forzatura.
            Considera che questo è ciò che di meglio abbia mai scritto in php... sono sicuro che quello che dici tu è più sicuro e non comporta di passare per 2 snippet in una volta sola. Però considerando le mie (in)capacità non vedevo perché riscrivere Ditto se Ditto ce l’avevo già: meglio sfruttare l’estensibilità del sistema e "concatenare" due snippet scrivendo solo ciò che mi serviva.
            Quote from: kimu

            Comunque, se sei ai primi passi, tutto ben venga.

            Ciao

            Grazie smiley
            Magari dò un’occhiata a come farlo in POST, secondo il tuo consiglio.
              kudo
              www.kudolink.com - webdesign (surprised?)

              [img]http://www.kudolink.com/kudolinkcom.png[/img] [sup]proudly uses[/sup] [img]http://www.kudolink.com/modx.png[/img]
              • 15896
              • 80 Posts
              Giuro, che un manuale di php non è cosi duro da digerire. E’ un linguaggio "facile". wink

              Comunque, purtroppo per il tuo problema (text sanitizing), soluzioni semplici non esistono. Di solito si adottano soluzioni in base al tipo della variabile. Per farti un esempio. Se per una determinata variabile ci si aspetta che venga assegnato un numero, si controlla che la stringa ricevuta tramite GET sia un numero e solo un numero.
              Se per un’altra variabile ci si aspetta che sia solo composta da caratteri alfanumerici, si fa un controllo in quel senso.
              Di solito si inizia con il controllare che non ci siano apici o doppi apici. E’ la cosa fondamentale, perchè un apice segna la fine di una stringa.

              Faccio un esempio:
              url?var=cippa //tutto bene
              url?var=cippa’;$rsl=mysql_query(SELECT * FROM USERS); while(.....);var_dump($rsl); //esempio molto banale e non veritiero, ma secondo te cosa potrebbe succedere?

              Ora, putroppo il problema richiede un po’ di studio. Molto dipende anche da come è settato il tuo sistema. Quello che ti posso consigliare è di andare a vedere su qualche manuale la trattazione delle stringhe e sulla guida funzioni come addslashes(), stripslashes(), htmlentities() ecc.
              Mentre per il controllo sul contenuto delle stringhe ti devi andare a studiare le espressioni regolari. Per il caso di variabili che debbano accettare solo numeri, il controllo sul valore in GET lo puoi fare con is_numeric(), che è una funzione php, ma il caso di variabili che debbano accettare un riestretto set di caratteri è più complesso, li è obbligatorio l’uso di espressioni regolari.
              Il text sanitizing è quasi completamente basato sulle espressioni regolari. Ci sono delle funzioni come quelle sopra citate che svolgono funzioni importanti, ma di solito, hanno più valore se usate verso dati ricevuti in GET o in POST che devono essere usati per interrogazioni verso db.
              Tieni conto che credo che Ditto faccia tutte le sue operazioni di text sanitizing, il punto "debole" è la transazione di questi paramentri dal tuo script.

              So che non ti sarà molto di aiuto, ma d’altronde non è una cosa della serie "passa tutto per la funzione filtro magico", perchè in questo caso è tutta una serie di concetti e tecniche a dover essere utilizzati.
              Una soluzioni meno "aperta" (POST e db+snippet) è già più intrisicamente sicura, comunque non esula dal dover anche in quel caso effettuare i passaggi per il controllo dei dati ricevuti.

              Ciao
                • 15896
                • 80 Posts
                Una nota (la notte porta consiglio grin):
                Ditto, non ho sottomano il codice, non credo faccia del text sanitizing per i suoi parametri, questo perchè sfrutta il meccanismo interno di modx, dove riceve i parametri tramite POST, ma che non partono da una imputazione dell’utente. Quella che viene eseguita è come una chiamata ad una funzione da parte del programmatore con il passaggio di parametri. Essendo a circuito chiuso, Ditto non necessità di controllare cosa gli arriva in entrata perchè non c’è modo che l’utente interferisca con il passaggio dei parametri.
                Nel tuo caso è l’esatto contrario, ed in un certo qual modo, vai a incrinare tutto l’assetto di sicurezza che il sistema degli snippet ha, eseguendo questo passaggio tramite GET.
                Non so esattamente quali siano qeusti parametri accettati da Ditto via GET, ma immagino pochi e controllati. Nel tuo caso, visto che quasi tutti i parametri, invece di usare la modalità interna di modx, vengono esposti, è veramente necessario che tu faccia del text sanitizing approfondito. Altrimenti esponi a vari pericoli il tuo sito.

                Ciao
                  • 16429
                  • 254 Posts
                  Per invalidare le stringhe in base alla presenza di certi simboli ho usato l’espressione regolare
                  [\^`~!/@\\#\}\$%:;\)\(\{&\*=\|'\+]
                  

                  Non son riuscito ad includere le parentesi quadre (se le metto matcha qualsiasi cosa, e sono sicuro di aver messo l’escape).

                  Cosa ne pensi kimu?
                    kudo
                    www.kudolink.com - webdesign (surprised?)

                    [img]http://www.kudolink.com/kudolinkcom.png[/img] [sup]proudly uses[/sup] [img]http://www.kudolink.com/modx.png[/img]
                    • 15896
                    • 80 Posts
                    Che è ottimo. wink

                    Se in generale i parametri è ammesso che contengano solo lettere e numeri (e nessun carattere speciale), fai prima con
                    [A-Za-z0-9]+

                    Se qualcosa dovesse essere ammesso puoi aggiungerlo dopo
                    [A-Za-z0-9_]+ //che include dentro anche il carattere underscore _ ...per fare un esempio...

                    Diciamo che fai forse prima a dirgli cosa è ammesso di quello che non è amesso.
                    A questo punto però devi fare una funzione che controlla ogni singolo parametro e in caso di individuazione di un carattere non ammesso esegua qualcosa per avvisare l’utente (un semplice echo "errore, i parametri non sono corretti..." va benissimo).

                    Ciao


                      • 2762
                      • 1,198 Posts
                      Nicola (Banzai) Reply #10, 20 years ago
                      Ho provato DittoMachine è veramente interessante, ma non ne avevo capito le potenzialità - complimenti Kudo wink

                      Volevo chiederti una cosa relativa all’esempio di form che hai fatto nella sezione internazionale:

                      Quote from: kudolink at Aug 22, 2006, 07:08 AM


                      <form class="FSF_form" action="productlists.html" method="get">
                      	<fieldset>
                      		<legend>Search Products by genre</legend>
                      			<select name="filter" id="filter" title="Products genres">
                      				<option value="tvgenre,Red">
                      				Red wines
                      				</option>
                      				<option value="tvgenre,White">
                      				White wines
                      				</option>
                      				<option value="tvgenre,Sweet">
                      				Sweet wines
                      				</option>
                      				<option value="tvgenre,Marsala">
                      				Marsala
                      				</option>
                      				<option value="tvgenre,Champagne">
                      				Champagne
                      				</option>
                      				<option value="tvgenre,Porto">
                      				Porto
                      				</option>
                      				<option value="tvgenre,Chablis">
                      				Chablis
                      				</option>
                      			</select>
                      		<input type="hidden" name="hiddenTVs" value="genre" />
                      		<input type="hidden" name="multiLevel" value="1" />
                      		<input type="hidden" name="sortBy" value="pagetitle" />
                      		<input type="hidden" name="sortDir" value="ASC" />
                      		<input class="FSF_submit" value="Go" type="submit" />
                      	</fieldset>
                      </form>
                      

                      And this is the DittoMachine call in the landing page, productlists.html:
                      [!DittoMachine? &startID=`5` &summarize=`2000` &displayArchive=`0` &tpl=`DittoProductslist` &paginate=`0` &emptyText=`Arriving`!]
                      



                      E’ possibile utilizzare un form simile per assegnare 2 filtri? ad esempio (nel tuo caso) il tipo di vino e la regione dove è prodotto??

                      come se il filtro della chiamata a Ditto fosse
                      &filter=tvgenre,White|tvregione,toscana
                        Free MODx Graphic resources and Templates www.tattoocms.it
                        -----------------------------------------------------

                        MODx IT  www.modx.it
                        -----------------------------------------------------

                        bubuna.com - Web & Multimedia Design