È una buona pratica utilizzare un URL vuoto per l'attributo di azione di un modulo HTML? (azione = "")


285

Mi chiedo se qualcuno possa fornire una risposta "best practice" all'utilizzo di azioni di moduli HTML vuoti per pubblicare di nuovo nella pagina corrente.

C'è un post che chiede cosa fa un'azione di modulo HTML vuoto qui e alcune pagine come questa suggeriscono che va bene, ma mi piacerebbe sapere cosa pensano le persone.


7
Suggerendo di applicare il tag "best practice".
Will Morgan,

Per confermare doppiamente, lasciare vuoto l'azione o semplicemente non menzionare affatto un'azione (come <form name="xyz" >). Inoltrerà l'azione da solo.
lwpro2

11
Non includere l'attributo action apre la pagina agli attacchi di clickjacking iframe , come quello in cui un utente malintenzionato avvolge la tua pagina in un iframe e l'URL iframe include un parametro di query con lo stesso nome di un campo del modulo. Quando il modulo viene inviato, il valore della query viene inserito nel database, quindi le informazioni di identificazione dell'utente (e-mail, indirizzo, ecc.) Sono state compromesse.
Paul Sweatte

Allora, qual è il modo valido e sicuro per inviare un modulo alla pagina corrente?
Costa

Risposte:


277

La cosa migliore che puoi fare è tralasciare completamente l'attributo action. Se lo tralasciate, il modulo verrà inviato all'indirizzo del documento, ovvero la stessa pagina.

È anche possibile lasciarlo vuoto e qualsiasi browser che implementa l'algoritmo di invio del modulo HTML lo tratterà come equivalente all'indirizzo del documento, cosa che fa principalmente perché è così che funzionano i browser attualmente:

8.Lascia che l'azione sia l' azione dell'elemento mittente .

9.Se action è la stringa vuota, lascia che action sia l'indirizzo del documento .

Nota: questo passaggio costituisce una violazione intenzionale dell'RFC 3986, che richiederebbe l'elaborazione dell'URL di base qui. Questa violazione è motivata dal desiderio di compatibilità con i contenuti precedenti. [RFC3986]

Funziona sicuramente in tutti i browser attuali, ma potrebbe non funzionare come previsto in alcuni browser meno recenti ( "i browser fanno cose strane con un'azione vuota =" "attributo " ), motivo per cui le specifiche scoraggiano fortemente gli autori dal lasciarlo vuoto :

Gli attributi actione formactioncontent, se specificati, devono avere un valore che è un URL valido non vuoto potenzialmente circondato da spazi .


12
Forse questo è cambiato dalla tua risposta (sono passati quasi tre anni), ma ad oggi, HTML5 non consente action=""- vedi la mia risposta ...
derobert

2
@derobert Grazie. Probabilmente non era cambiato. Ho cambiato la mia risposta per riflettere meglio ciò che dice la specifica.
mercator

75

In realtà, la sottosezione Invio modulo dell'attuale bozza HTML5 non lo consente action="". È contro le specifiche.

Gli attributi actione formactioncontent, se specificati, devono avere un valore che è un URL valido non vuoto potenzialmente circondato da spazi. (enfasi aggiunta)

La sezione citata nella risposta di Mercator è un requisito per le implementazioni , non per gli autori . Gli autori devono seguire i requisiti dell'autore. Per citare Come leggere questa specifica :

In particolare, esistono requisiti di conformità che si applicano ai produttori, ad esempio gli autori e i documenti che creano, e ci sono requisiti di conformità che si applicano ai consumatori, ad esempio i browser Web. Possono essere distinti in base a ciò che richiedono: un requisito per un produttore afferma ciò che è consentito, mentre un requisito per un consumatore stabilisce come deve agire il software.

La modifica da HTML4, che consentiva un URL vuoto, è stata apportata perché "i browser fanno cose strane con un action=""attributo vuoto ". Considerando il motivo del cambiamento, probabilmente è meglio non farlo neanche in HTML4.


Permette la totale assenza actiondell'attributo per indicare il modulo da inviare all'indirizzo del documento? Sembra, dal momento che dice, "se specificato".
Kerrick

2
@Kerrick Sì, credo che HTML5 consenta di omettere completamente l'attributo di azione e di impostarlo come predefinito su una stringa vuota. HTML4 no, specifica l'azione come richiesto.
derobert

Sono d'accordo con @Kerrick, è consentito omettere l'attributo action. Leggendo l'attuale draf HTML5, sembra che una stringa vuota non sia consentita ma l'assenza dell'attributo è consentita. Ma in ogni caso, per motivi di compatibilità, ti consiglio di includere sempre l'attributo "action" e di riempirlo con un URL valido non vuoto (le buone pratiche sono sempre il modo migliore).
serfer2

Un potenziale problema: AngularJS impedirà l'invio di moduli senza un attributo di azione. Probabilmente non è un problema comune, ma mi ci è voluto un po 'per capire perché alcune parti del nostro sito precedente hanno iniziato a rompersi.
Asmor

18

Non includere l'attributo action apre la pagina agli attacchi di clickjacking iframe , che comportano pochi semplici passaggi:

  • Un utente malintenzionato avvolge la tua pagina in un iframe
  • L'URL iframe include un parametro di query con lo stesso nome di un campo modulo
  • Quando il modulo viene inviato, il valore della query viene inserito nel database
  • Le informazioni di identificazione dell'utente (e-mail, indirizzo, ecc.) Sono state compromesse

Riferimenti


2
L'URL iframe non contiene parametri GET, mentre i moduli di solito inviati tramite POST? Quindi se il sito si occupa solo dei parametri POST, non dovrebbe essere un problema, no? Almeno di solito uso l'array $ _POST in PHP solo durante l'elaborazione dei moduli.
Calmarius

2
@Calmarius Sì, usa $_POSTinvece di $_REQUESTper evitare questo. Se il codice del framework utilizza $_REQUEST, utilizza un buster iframe .
Paul Sweatte

17

Questo verrà convalidato con HTML5.

<form action="#">

4
Non l'ho provato, ma concettualmente non sarebbe scorrere fino all'inizio della pagina dopo l'invio?
Matt Mitchell

2
Non potresti usare action="."?
s427

3
azione = "?" funziona bene anche. Convalida e punta alla pagina corrente senza i dati della stringa di query.
Chris Broski

5
action="."è una cattiva idea per il caso generale. Un URL simile example.com/loginè mappato semplicemente example.com/.
Torsten Bronger

1
Questa risposta è valida solo se l'utente desidera scorrere fino all'inizio della pagina.
Ma l'

10

IN HTML 5 action=""NON È SUPPORTATO QUINDI NON FARLO. CATTIVA PRATICA.

Se invece annulli completamente l'azione verrà inviata alla stessa pagina per impostazione predefinita, credo che questa sia la migliore pratica:

<form>This will submit to the current page</form>

Se stai compilando il modulo usando php potresti prendere in considerazione quanto segue. Per saperne di più qui.

<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">

In alternativa puoi usare, #tieni presente che questo fungerà da ancora e scorrerà fino all'inizio della pagina.

<form action="#">

Vorresti capire perché qualcuno ha votato negativamente questa risposta?
Ma il

Impegni l'attributo action, il modulo è ancora aperto agli exploit sono descritti in dettaglio nella prima pagina del link?
Richard Young

@RichardYoung Scusa, non capisco la tua domanda. Per favore riformula.
Ma il

1
La variabile $ _SERVER ["PHP_SELF"] può essere utilizzata dagli hacker. Se PHP_SELF viene utilizzato nella tua pagina, un utente può inserire una barra (/) e quindi alcuni comandi Cross Site Scripting (XSS) da eseguire. Se ometti l'attributo action, sei ancora vulnerabile a questo?
Richard Young,

Sì, sei tu. L'attributo action può essere aggiunto di nuovo nel lato client e dato qualsiasi valore di scelta. Tuttavia, l'utilizzo della htmlspecialchars()funzione impedisce alle persone di utilizzare il tuo script php contro di te.
Ma il

4

Normalmente utilizzo action = "", che è valido per XHTML e conserva i dati GET nell'URL.


4
Raramente, ma ad esempio, nel mio forum, avrei l'URL: thread.php? Id = 12 & page = 6 e c'è un modulo POST in fondo alla pagina per aggiungere commenti, e ho bisogno dei dati GET così il PHP sa a quale thread aggiungere il commento.
Juddling

20
GET è il metodo predefinito per i moduli - non è certo una brutta cosa ;-) w3.org/TR/html401/interact/forms.html#adef-method
NickFitz

5
Usare GET nei moduli è una cosa negativa. Se l'utente ricarica la pagina dopo l'invio, potrebbero verificarsi conseguenze indesiderate. Tuttavia, se viene utilizzato un POST, il browser avviserà di inviare nuovamente gli stessi dati.
Will Sheppard il

22
@ WillSheppard Non sono d'accordo. Non puoi fare una dichiarazione generale del genere. Tutto dipende da cosa fa il modulo. Dovresti usare POST per tutto ciò che esegue un'azione (ad esempio l'inserimento di un nuovo post in un forum), ma GET per tutto il resto (ad esempio una casella di ricerca o l'utilizzo di moduli per la navigazione). Dopo un POST riuscito, lo script dovrebbe reindirizzare il browser per impedire all'utente di inviare nuovamente i dati.
Mike

3
PS non tutti i browser avvisano l'utente del reinvio dei dati POST (ad esempio Opera)
Mike

4

Penso che sia meglio indicare esplicitamente dove viene pubblicato il modulo. Se vuoi essere totalmente al sicuro, inserisci lo stesso URL in cui si trova il modulo nell'attributo action se vuoi che venga reinviato a se stesso. Sebbene i browser tradizionali valutino ""la stessa pagina, non puoi garantire che i browser non tradizionali lo faranno.

E, naturalmente, l'intero URL, inclusi i dati GET come sottolinea Juddling.


2

Basta usare

?

<form action="?" method="post" enctype="multipart/form-data" name="myForm" id="myForm">

Non viola gli standard HTML5.


Non ho downvote ma il tuo metodo lascerà cadere tutti i getparametri. Un modulo sul seguente URL si interromperà example.com/update_user?user_id=1perché il modulo verrà example.com/update_user?
inviato

1

Lo facevo spesso quando lavoravo con Classic ASP. Di solito lo usavo quando era necessaria una convalida lato server di qualche tipo per l'input (prima dei giorni di AJAX). Lo svantaggio principale che vedo è che non separa la logica di programmazione dalla presentazione, a livello di file.


1
perchè no? Penso che non sia connesso. Posso fare in modo che un modulo invii i dati alla stessa pagina e crei questa pagina con la corretta separazione del controller e della vista.
markus

1

Uso per non specificare affatto l'attributo di azione. In realtà è il modo in cui è progettato il mio framework, tutte le pagine vengono inviate esattamente allo stesso indirizzo. Ma oggi ho scoperto il problema. A volte prendo in prestito il valore dell'attributo di azione per effettuare una chiamata in background (immagino che alcune persone li chiamino AJAX). Quindi ho scoperto che IE mantiene il valore dell'attributo di azione vuoto se l'attributo di azione non è stato specificato. È un po 'strano nella mia comprensione, poiché se non viene specificato alcun attributo di azione, la controparte JavaScript deve essere almeno indefinita. Ad ogni modo, il mio punto è prima di scegliere la migliore pratica è necessario comprendere più contesto, ad esempio utilizzerai l'attributo in JavaScript o meno.


0

Quando metti un'azione vuota, alcuni filtri di sicurezza la considerano dannosa o phishing. Quindi possono bloccare la tua pagina. Quindi è consigliabile non mantenere action = blank.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.