Implementazione ciclo for per ottimizzare il codice

Salve a tutti.

In uno script che sto usando per installare un cms, ho questa porzione di codice:

         setcookie ('$nomesito', $_POST['nomesito']);

         setcookie ('$indirizzo', $_POST['indirizzo']);

         setcookie ('$dbhost', $_POST['dbhost']);

         setcookie ('$dbuser', $_POST['dbuser']);

         setcookie ('$dbpass', $_POST['dbpass']);

         setcookie ('$dbname', $_POST['dbname']);

         setcookie ('$user', $_POST['user']);

         setcookie ('$pass', $_POST['pass']);

         setcookie ('$email', $_POST['email']);          

         $sitename = trim(htmlentities($_POST['nomesito']));

         $siteaddr = trim(htmlentities($_POST['indirizzo']));

         $dbhost = trim(htmlentities($_POST['dbhost']));

         $dbuser = trim(htmlentities($_POST['dbuser']));

         $dbpass = trim(htmlentities($_POST['dbpass']));

         $dbname = trim(htmlentities($_POST['dbname']));

         $adminuser = trim(htmlentities($_POST['user']));

         $adminpass = trim(htmlentities(md5($_POST['pass'])));

         $adminemail = trim(htmlentities($_POST['email']));

Dopo avere inviato i dati da un form, questi vengono prima scritti in cookie e poi immessi nelle variabili che andrò a processare nella query. I cookie mi servono in modo tale che se l'utente sbaglia qualcosa, o dimentica un dato, al ritorno alla pagina del form, i dati non gli spariscano.

Ora, premesso che questo codice e tutto lo script funziona perfettamente, mi sono messo in testa, nell'ottica di imparare sempre di più, di ottimizzare questo codice e di automatizzare tutto con dei cicli.

Esempio ho provato questa cosa:

         $elements = array("nomesito","indirizzo","dbhost","dbuser","dbpass","dbname","user","pass","email");

         foreach ($elements as $element) {

            setcookie ("\$".$element, $_POST[$element]);

            "\$".$element= trim(htmlentities($_POST[$element]));   

         }

Ho pensato di creare un array esplicitato anziché ricorrere al $_POST per ottenere solo i campi che mi interessano (escludendo il button).

Vorrei sapere se la metodica è corretta e se il tipo di ciclo usato è corretto. Poi posso insistere da solo.

Grazie

inviato 5 anni fa
kama
kama
1
X 0 X

proprio nessuno?

risposto 5 anni fa
kama
kama
1
X 0 X

Non hai bisogno di usare i cookie per mostrare nuovamente i valori immessi nel form.

Basta che usi come action del form lo stesso script che usi per mostrarlo e i dati saranno direttamente dentro $_POST.

Dovresti comunque (è importante) filtrare i dati che ti arrivano da $_POST e non usarli direttamente (non basta l'escape fatto, giustamente, con htmlentities).

Puoi introltre migliorare evitando di usare variabili diverse (quelli che attualmente assegni usando i nomi delle chiavi di $_POST), ma usando un altro array. Quindi per esempio: $vars['nomesito'], $vars['indirizzo'], ecc.

risposto 5 anni fa
Massimiliano Arione
X 0 X

Ciao Garak, grazie per la risposta...

In questi giorni ho ulteriormente migliorato il codice... non capisco come non debba ricorrere ai cookies... a parte che ho cambiato e ho messo session per rendere la cosa più sicura ( sto facendo più cose alla volta, sicurezza, ottimizzazione del codice, ecc)... ogni volta che c'è un eventuale errore, la pagina viene ricaricata e i dati vengono persi, specie se per esempio, l'utente digita male il nome del database o peggio, non lo crea, quando viene dato l'errore sql e torna indietro nella pagina, i dati non vengono immessi...

cmq ho effettuato delle migliorie che credo vadano bene, leggendo e rileggendo da più parti la problematica di sicurezza validazione/escaping

Posto un parte del codice, se gentilmente potreste dirmi dove posso ulteriormente migliorare...

// Inizia il codice con il form dell'installer

if (!$_POST) {

mostro il form

           // Il form è stato inviato ed eseguo le azioni

         } else {

         //scrivo i valori degli input in variabili session perché possano ricomparire in caso di ricarimento della pagina per non riscrivere tutto, in caso di errore

         $_SESSION['$sitename'] = $_POST['sitename'];

         $_SESSION['$siteaddr'] = $_POST['siteaddr'];

         $_SESSION['$dbhost'] = $_POST['dbhost']; 

         $_SESSION['$dbuser'] = $_POST['dbuser'];

         $_SESSION['$dbpass'] = $_POST['dbpass'];

         $_SESSION['$dbname'] = $_POST['dbname'];

         $_SESSION['$adminuser'] = $_POST['adminuser'];

         $_SESSION['$adminemail'] = $_POST['adminemail'];          

         // Valido il nome del sito

         if (!validateInput($_POST['sitename'])) {

            sendMessage("Enter Site name", "#ff0000");

            header("Location: ".$_SERVER['PHP_SELF']);

            exit;

         // Valido l'url

         } else if (!validateUrl($_POST['siteaddr'])) {

            sendMessage("Enter a correct Site url", "#ff0000");

            header("Location: ".$_SERVER['PHP_SELF']);

            exit;

         // Valido il nome del database

         } else if (!validateInput($_POST['dbhost'])) {

            sendMessage("Enter db Host", "#ff0000");

            header("Location: ".$_SERVER['PHP_SELF']);

            exit;      

         // Valido il nome dell'utente database

         } else if (!validateInput($_POST['dbuser'])) {

            sendMessage("Enter db Username", "#ff0000");

            header("Location: ".$_SERVER['PHP_SELF']);

            exit;   

         // Valido la password del database   

         } else if (!validateInput($_POST['dbpass'])) {

            sendMessage("Enter db Password", "#ff0000");

            header("Location: ".$_SERVER['PHP_SELF']);

            exit;               

         // Valido il nome del database   

         } else if (!validateInput($_POST['dbname'])) {

            sendMessage("Enter db Name", "#ff0000");

            header("Location: ".$_SERVER['PHP_SELF']);

            exit;            

         // Valido il nome dell'amministratore

         } else if (!validateUsername($_POST['adminuser'])) {

            sendMessage("Enter the Administrator username", "#ff0000");

            header("Location: ".$_SERVER['PHP_SELF']);

            exit;            

         // Valido la password dell'amministratore

         } else if (!validatePassword($_POST['adminpass'])) {

            sendMessage("Enter the Administrator password", "#ff0000");

            header("Location: ".$_SERVER['PHP_SELF']);

            exit;               

         // Valido la conferma della password dell'amministratore   

         } else if (!validatePassword($_POST['adminconf'])) {

            sendMessage("Confirm the Administrator password", "#ff0000");

            header("Location: ".$_SERVER['PHP_SELF']);

            exit;               

         // Valido l'email

         } else if (!validateEmail($_POST['adminemail'])) {

            sendMessage("Enter a correct Administrator email address", "#ff0000");

            header("Location: ".$_SERVER['PHP_SELF']);

            exit;   

         // Controllo che username e password non siano uguali

         } else if ($_POST['adminuser'] == $_POST['adminpass']) {

            sendMessage("Username and Password must be not the same!", "#ff0000");

            header("Location: ".$_SERVER['PHP_SELF']);

            exit;               

         } else {

         // Inserisco i dati $_POST validati in variabili

         $sitename = trim(htmlentities($_POST['sitename']));

         $siteaddr = trim(htmlentities($_POST['siteaddr']));

         $dbhost = trim(htmlentities($_POST['dbhost']));

         $dbuser = trim(htmlentities($_POST['dbuser']));

         $dbpass = trim(htmlentities($_POST['dbpass']));

         $dbname = trim(htmlentities($_POST['dbname']));

         $adminuser = trim(htmlentities($_POST['adminuser']));

         $adminpass = trim(htmlentities(md5($_POST['adminpass'])));

         $adminconf = trim(htmlentities(md5($_POST['adminconf'])));

         $adminemail = trim(htmlentities($_POST['adminemail']));

         // Controllo che la password venga correttamente confermata anche tenendo conto del case-sensitive   

         if (!strcmp($adminpass,$adminconf)==0) {

            sendMessage("Administrator password does not match with confirmation field!", "#ff0000");

            header("Location: ".$_SERVER['PHP_SELF']);

            exit;   

         }

         // Scrivo il file di configurazione

// segue la scrittura con fopen e fwrite del file di configurazione,

costruzione delle tabelle con opportuni DDL,

unset delle session per i campi,

invio email di conferma,

unlink del file

Le varie funzioni di validateEmail(), validateUrl(), ecc chiamano funzioni contenenti confronti preg_match con regular expresson, come suggerito da Garak

Comunque provando tutto funziona, cerco solo miglioramenti

Grazie mille, buon lavoro

risposto 5 anni fa
kama
kama
1
X 0 X

Non ho capito questa serie di if...

Scusa, non fai prima a fare un controllo di tutti i dati inviati, se c'è qualcosa di sbagliato ritorni il tuo form con all'interno i valori forniti dall'utente?

Esattamente come ti ha detto garak, senza inviare particolari header o fare tutta questa serie di if con header e senza usare le sessioni (che qui non ti servono se si tratta di un controllo dei dati inseriti).

In proposito ti consiglio di vedere Zend_Form che può semplificarti la vita. Un bell'articolo esplicativo:

http://akrabat.com/tutorial/simple-zend_form-example/

Garak sicuramente potrà suggerirti un altro framework utile per queste cose.

ciao

risposto 5 anni fa
Mario Santagiuliana
X 0 X

Ciao, grazie per il tuo intervento...

Tutta la serie di if è dovuta alla necessità di voler dare un messaggio di errore dedicato per ogni campo che manca... forse quando dici di controllarli tutti insieme intendi una unica if con il controllo dei valori intervallati da OR

if (!validateUrl($:POST['url'] || !validateEmail($:POST['email'] || ecc. ecc. ))

Non ricordo bene perché sono arrivato al punto di mettere i cookies prima e le session dopo, adesso riprovo a rivedere la struttura del file, ma prendo spunto dal discorso dei framework per farti una domanda...

Io ho creato alcune applicazioni che sono in produzione, che poi siano scritte male questo è un altro paio di maniche... i framework li ho sempre visti come un passaggio superiore da compiersi solo e unicamente quando si conosce la programmazione procedurale, cosa che non posso dire di conoscere ancora bene...

è secondo te un passaggio che si può compiere anche senza una conoscenza professionale della programmazione procedurale? Mi piace molto codeignitier, ho l'impressione che abbia una curva di apprendimento un pò più semplice

Grazie per rispondermi

risposto 5 anni fa
kama
kama
1
X 0 X
è secondo te un passaggio che si può compiere anche senza una conoscenza professionale della programmazione procedurale? Mi piace molto codeignitier, ho l'impressione che abbia una curva di apprendimento un pò più semplice

Non conosco bene codeignitier, non l'ho mai usato.

Non vedo perchè non passare alla programmazione ad oggetti se prima non si conosce al meglio la programmazione procedurale. La procedurale è "logica" come anche quella ad oggetti, che se non compresa bene può sembrare assurda o poco intuitiva.

I framework sono utilissimi per creare delle applicazioni con pattern standard e con una scrittura pulita delle applicazioni, semplificando la portabilità e l'introduzione di altri sviluppatori nel progetto.

Per me vale: capita la sintassi Php e le basi della programmazione, capita la programmazione ad oggetti, si può passare senza troppe paranoie all'ultima soluzione ed utilizzare il framework preferito per un progetto grande o se si vuole risparmiare tempo sulla programmazione.

risposto 5 anni fa
Mario Santagiuliana
X 0 X

Hai usato la parola giusta... paranoia... in effetti da più parti mi sono sempre reso conto di quello che dici, leggendo qua e là, che i framework ti aiutano a risparmiare un sacco di tempo...

però per mancanza di esperienza e di contatto con persone esperte del settore, non ho mai avuto un riscontro in merito da parte di chi ne sa ben di più...

quindi questa tua risposta è molto utile perché mi dai la certezza che passare al framework senza essere un mostro di procedurale, è una cosa fattibile

thank's

risposto 5 anni fa
kama
kama
1
X 0 X

Concordo con Mario: non serve imparare prima in procedurale e poi passare a OOP (programmazione a oggetti).

Ovviamente l'utilizzo di un framework ti costringerà inizialmente a cambiare modo di pensare e quindi comporterà necessariamente uno sforzo da parte tua. Sappi però che questo sforzo sarà ampiamente ricompensato dall'opportunità di poter tralasciare tutti i problemi comuni (come per esempio validazione di input, escape di output, ripopolamento dei valori dei form, ecc.) e di concentrarti sulla logica della tua applicazione.

Il mio consiglio personale è di provare symfony, perché è ottimamente documentato, anche in italiano, e ha una grande comunità.

Ma alla fine, secondo me, c'è molta più differenza tra usare un framework e non usare un framework, piuttosto che tra usare il framework pippo e usare il framework pluto.

risposto 5 anni fa
Massimiliano Arione
X 0 X

Ciao Garak, avevo già visto qualcosa di simfony, mi aveva un pò spaventato ricordo... infatti codeigniter mi era piaciuto perchè mi sembrava molto più semplice almeno a prima vista, ma a parte qualche volenteroso, di materiale in italiano c'é proprio poco o nulla... adesso rivedrò un attimo le cose anche tenendo conto ovviamente delle comunità... io comunque sono intenzionato a proseguire nello sviluppo di piccoli applicativi, e da quello che leggo codeigniter è più indicato... chiaramente poi ognuno dice la sua...

grazie per i vostri interventi...

risposto 5 anni fa
kama
kama
1
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda