Submit in JavaScript

6 risposte [Ultimo contenuto]
Ritratto di UmbraSolis
UmbraSolis
(Junior)
Offline
Junior
Iscritto: 24/07/2007
Messaggi: 16

Gente, ho un form di cui voglio fare il submit esclusivamente tramite JavaScript, ma al quale voglio anche applicare uno script di validazione. Ecco qui:

<form name="nomeform" method="post" action="file.php" onSubmit="return validazione();">
<input type="hidden" name="id" value="123">
<select name="sP">
<option value="pp">Provincia 1</option>
...
<option value="up">Provincia ultima</option>
</select>
<input type="button" onClick="submit()" value="INSERISCI">
</form>

Ho messo di proposito il tag "input" come "button" e non come "submit" per far sì che il form sia inviato solo se JavaScript è attivo.

Ho un problema, però: se faccio così, non funziona lo script di validazione, mentre se metto un
<button onClick="submit()">INSERISCI</button>,
lo script di validazione si attiva e mi dà il messaggio che mi aspetto, ma poi invia il form anche se non dovrebbe.

L'unico modo per far funzionare tutto a dovere è inserire il canonico <input type="submit" value="INSERISCI">, solo che così va a quel paese l'idea di rendere necessario che JavaScript sia attivo nel browser.

C'è una scappatoia a questo? E' una cosa impossibile quella che sto tentando di fare o ha un senso?

Vi ringrazio tutti quanti fin d'ora.

P.S. Il tutto funziona sempre allo stesso modo sia mettendo submit() che this.form.submit().

You can be anything you want to be . . .
-------------------------------------------------------------
Registered Linux user # 450729
Registered Debian user # 87

Ritratto di pietro
pietro
(Collaboratore)
Offline
Collaboratore
Iscritto: 30/06/2005
Messaggi: 1124

Non ci hai fornito il codice di validazione() e submit(), se ci mancano dei pezzi e' un po' difficile capire perche' non funziona.

Secondo la mia esperienza meno codice lato client utilizzi, meglio e' . Uno dei motivi e' che non puoi mai fare affidamento sul client perche' ci sono una miriade di browser ed una miriade di sistemi operativi (anche se la distribuzione non e' propriamente uniforme) che potrebbero avere bug di ogni tipo che non puoi controllare.

Un altro motivo e' che lato client e' possibile manipolare tutto: puoi mettere tutti i controlli JavaScript che vuoi, ma se voglio ti guardo il codice effettuo un POST a mano con dei valori che non sono validi. Quindi e' sempre meglio effettuare tutti i controlli di validita' delle form anche lato server.

Certo, dipende dalla specifica applicazione che stai sviluppando, ma se hai bisogno solo di controllare che il JavaScript sia attivo puoi semplicemente valorizzare un campo della form da JavaScript e controllarlo lato server: se e' impostato il JS e' attivo altrimenti ciccia (la prima che mi e' venuta in mente, ma sicuramente c'e' un metodo piu' pulito).

Pietro

Debian. Be unique.

Ritratto di UmbraSolis
UmbraSolis
(Junior)
Offline
Junior
Iscritto: 24/07/2007
Messaggi: 16

Ti chiedo scusa, ma il codice di validazione() sarebbe davvero lungo da postare, mentre il submit è la funzione di default dell'oggetto form, quella che serve ad inviare il form.

La funzione validazione() ha sempre funzionato a dovere fino a che ho usato il tag <input type="submit" value="INSERISCI">.

In compenso, facendo nel mentre delle prove, ho scoperto che con (almeno con Iceweasel) il form veniva spedito con tutti e tre i tag citati nel primo post, mentre io pensavo che (almeno così ho letto finora) si potesse spedire un form solamente con <input type="submit" value="INSERISCI">, mentre per usare gli altri è necessario il gestori di eventi con la funzione per spedire onClick="submit()".

Sono d'accordissimo con la tua idea di controllare i valori del form anche lato server, ma come faccio a proteggermi da attacchi tipo quello che tenta di eseguire codice PHP inserendo in un elemento del form il tag "<?" seguito poi da codice PHP? Ci sono altri modi per proteggermi da questo attacco? O forse è una cosa di cui non mi devo preoccupare?
Ti chiedo di illuminarmi perchè di questo so proprio poco...

Ti posto comunque come allegato il file contenente la funzione validazione().

Grazie davvero tanto!

You can be anything you want to be . . .
-------------------------------------------------------------
Registered Linux user # 450729
Registered Debian user # 87

Ritratto di kripsio
kripsio
(Collaboratore)
Offline
Collaboratore
Iscritto: 10/09/2004
Messaggi: 1511

Solite righe serali per distrarsi qualche minuto.

Magari non è il tuo caso ma è pratica ahimè comune per gli scripter php iniziare a scrivere from scratch le applicazioni e le pagine (come se un programmatore c++ si scrivesse la stdio, non ha tanto senso no?).
Questo perchè un po' pratico, un po' perchè se mi metto a studiare librerie e/o framework non ci salto più fuori, un po' perchè bhè funziona lo stesso ed è pure più veloce.

Per poi venire a scoprire quando si programma davvero su progetti un po' più grandicelli che caso mai quelle librerie già mantenute fanno comodo, che, capista, la logica con cui lavora quel framework è intelligente, pratica, snella, astrae, il mio programmatore nuovo non capisce una cippa di quello che ho scritto ed è 10 anni che lavora con php tutti i giorni.

Un po' perchè, il motivo, anche, per cui ho smesso io, nascono e muoiono framework per php come funghi, di librerie ce ne sono un chiglione con 3 condimenti al ragù in omaggio ogni download e perdo 1 settimana per trovare quella fica che fa per me, imparare ad usarla, integrarla nel mio workflow e metterla in produzione e dopo 1 mese non è più supportata da nessuno se non dal programmatore originario che è un giovanotto giapponese che di giorno affetta sushi e di sera, quando non prende la ciucca col sake e non ciula la ragazza scrive 4 righe di quella libreria che morirà per ovvie ragioni.

Se vuoi lavorare davvero con php trova un framework che ti liberi (con cognizione di causa) del lavoro sporco, appunto la validazione per il tuo caso, ma anche l'astrazione dal db, ma soprattutto le procedure logiche per rendere coeso, manutentibile e non direttamente legato al programmatore il codice. Se ti cade l'occhio su un po' di progetti in php che hanno radici vecchie vedrai che sono tutti sviluppati con logiche diverse (oltre a tanti che manco usano le librerie nemmeno autocostruite). Questo ovviamente è deleterio nel momento in cui devi far programmare qualcuno sulla tua piattaforma che caso mai è un grande coder ma ci mette un disastro solo per capire come hai organizzato le cose.
Ultimamente (cioè da tanti mesi) il nostro paolo sta lavorando parecchio con symfony http://www.symfony-project.com/ e ne parla davvero un gran bene e sembra non sia una bolla di sapone, personalmente non lo seguo, magari interviene direttamente lui.

Personalmente, se e quando avrò tempo, mi piacerebbe studiare un po' Ruby on Rails http://en.wikipedia.org/wiki/Ruby_on_Rails per un motivo abbastanza semplice: in realtà poco manca che ruby esiste solo perchè c'è rails e nessuno si mette a scrivere un altro rails per sfizio. Mi pare che il sistema abbia un approccio più sensato. La logica di rails, per il poco che l'ho studiata, mi sembra molto razionale e pratica.

Si lo so.
Questo post non ti risolve il problema e non ti aiuta nemmeno un po' a risolverlo. Per risolverlo trova qualche testo sulla sicurezza di php o su come validare in maniera sicura lato server dei dati... troverai qualcosa come millemilli di script, consigli, suggerimenti, librerie tutte con la loro logica, con il loro modo di risolvere le cose, perchè scriverne un altro? Magari se scarichi la libreria giusta, oltre a risolverti il problema, ti arriva a casa il sugo pronto di Nonna Papera...

PS tanto per chiarire il motivo di questo intervento.
Dipende cosa vuoi fare del php e della programmazione in se. Se vuoi giocare con 4 pagine alla fine che siano sicure o meno non è che poi devi fasciarti la testa, se te le bucano sfiga, si rifaranno. Se hai messo dati sensibili in una applicazione e non sai validare (abc dei form webboli), bhè, lascia anche la porta di casa aperta con 1000 euro nell'ingresso e la collezione si swarovsky in bella vista.
Se vuoi imparare a scrivere roba che abbia un senso, sicura, utile e quindi in direzione di una professione stai seguendo l'approccio sbagliato: vado per tentativi e sistemo man mano raccattando quà e la script e consigli. Se ti va di fidarti, fidati di uno che ha fatto _esattamente_ così e dopo 5 anni si è reso conto di non aver capito un accidente Smile. Se ti va di scrivere robi che abbiano un valore, relativamente sicuri, manutentibili, utili e blabla devi avere visione d'insieme delle cose, trovare gli strumenti giusti e supportati, imparare come ottenere da questi il massimo e non scriptare 400 righe al giorno per risolvere i problemi che ti saltano all'occhio.

Mo ciaooo! Smile

Ritratto di paolo
paolo
(Webmaster)
Offline
Webmaster
Iscritto: 04/10/2004
Messaggi: 1277

Validare e controllare ogni input esterno da PHP è fondamentale, per vitare ogni tipo di attacco, ad esempio puoi guardare questa classe:

http://www.phpclasses.org/browse/package/2075.html

Potresti anche fare a meno della validazione Js, è totalmente inutile, basta disabilitare Javascript lato client per perdere ogni tipo di controllo sui dati immessi in input.

Inoltre, gia che ci sei ti consiglio di appoggiarti a qualche buon framework php per i tuoi progetti, ad esempio Symfony

Ciao

Paolo Mainardi
CTO Twinbit http://www.twinbit.it
Vice Presidente -- ILDN - Italian Linux DIstro Network

Ritratto di pietro
pietro
(Collaboratore)
Offline
Collaboratore
Iscritto: 30/06/2005
Messaggi: 1124

Ciao UmbraSolis, preferisco risponderti sul forum invece che per pm perche' la discussione potrebbe essere utile anche ad altre persone.

Non voglio entrare nei dettagli specifici del tuo script, anche perche' ci metterei troppo tempo a capire un codice scritto da altri senza provarlo anche se ben commentato come il tuo, ma il concetto base che devi tenere a mente se vuoi pensare seriamente alla sicurezza e' il seguente:

non basare mai i controlli critici sul client.

La variabile $_SERVER['HTTP_REFERER'] che hai citato nel pm, ad esempio, e' comunque un'informazione inviata dal browser e per niente obbligatoria nello standard HTTP/1.1. Quando il browser invia una form, indipendentemente da tutto lo JavaScript che c'e' a monte, si tratta sempre di caratteri che passano dal client al server in forma testuale col protocollo HTTP: niente di magico. Nulla vieta ad un pirata di inviare le stesse identiche informazioni da riga di comando, saltando alla grande tutti i controlli che puoi aver messo sul client e modificando a piacere tutti i valori che vuole (compreso il referer...).

Se vuoi un consiglio, limita i controlli sul client a quelli necessari per il corretto funzionamento della form, es. campi che si attivano in base a valori inseriti in altri campi, valorizzazione di drop-down, ecc., ma effettua tutti i controlli "di business" sul server.

Ovviamente ti consiglio di seguire anche le preziose indicazioni di paolo e kripsio.

Spero di esserti stato d'aiuto.

Pietro

Debian. Be unique.

Ritratto di UmbraSolis
UmbraSolis
(Junior)
Offline
Junior
Iscritto: 24/07/2007
Messaggi: 16

Ringrazio tutti quanti davvero di cuore per la pazienza, l'attenzione e i preziosissimi consigli: mi avete aperto moltissimo gli occhi su tante cose.

Un grazie particolare a Pietro, che ha avuto la pazienza di leggere il mio chilometrico script.

Alla prossima!

You can be anything you want to be . . .
-------------------------------------------------------------
Registered Linux user # 450729
Registered Debian user # 87