É uma boa prática usar um URL vazio para o atributo de ação de um formulário HTML? (ação = "")

279

Gostaria de saber se alguém pode dar uma resposta sobre "práticas recomendadas" ao usar ações em branco do formulário HTML para postar de volta na página atual.

uma postagem perguntando o que uma ação de formulário HTML em branco faz aqui e algumas páginas como esta sugerem que está bem, mas eu gostaria de saber o que as pessoas pensam.

Matt Mitchell
fonte
7
A sugestão da tag "melhores práticas" deve ser aplicada a isso.
Will Morgan
Para confirmar duplamente, deixe a ação em branco ou simplesmente não mencione uma ação (como <form name="xyz" >). Ele enviará a ação por conta própria.
Lwpro2
11
A não inclusão do atributo action abre a página para ataques de clickracking de iframe , como aquele em que um invasor agrupa sua página em um iframe e o URL do iframe inclui um parâmetro de consulta com o mesmo nome que um campo de formulário. Quando o formulário é enviado, o valor da consulta é inserido no banco de dados, para que as informações de identificação do usuário (email, endereço etc.) sejam comprometidas.
Paul Sweatte 17/08/2012
Então, qual é a maneira válida e segura de enviar um formulário para a página atual?
Costa

Respostas:

268

A melhor coisa que você pode fazer é deixar de fora o atributo action. Se você deixar de fora, o formulário será enviado para o endereço do documento, ou seja, a mesma página.

Também é possível deixá-lo vazio, e qualquer navegador que implemente o algoritmo de envio de formulários HTML o tratará como equivalente ao endereço do documento, o que ocorre principalmente porque é assim que os navegadores atualmente funcionam:

8.Deixe a ação ser a ação do elemento emissor .

9.Se a ação for a sequência vazia, deixe que a ação seja o endereço do documento .

Nota: Esta etapa é uma violação intencional da RFC 3986, que exigiria o processamento básico da URL aqui. Essa violação é motivada pelo desejo de compatibilidade com o conteúdo herdado. [RFC3986]

Isso definitivamente funciona em todos os navegadores atuais, mas pode não funcionar como esperado em alguns navegadores mais antigos ( " navegadores fazem coisas estranhas com uma ação vazia =" "atributo " ), e é por isso que a especificação desencoraja fortemente os autores de deixá-lo vazio :

Os atributos actione formactioncontent, se especificados, devem ter um valor que seja um URL não vazio válido, potencialmente cercado por espaços .

mercator
fonte
12
Possivelmente isso mudou desde a sua resposta (sua sido quase três anos), mas a partir de hoje, o HTML5 não permite action=""-veja a minha resposta ...
derobert
2
@derobert Obrigado. Provavelmente isso não havia mudado. Alterei minha resposta para refletir melhor o que as especificações dizem.
mercator
73

Na verdade, a subseção Envio de formulário do rascunho atual do HTML5 não permite action="". É contra as especificações.

Os atributos actione formactioncontent, se especificados, devem ter um valor que seja um URL não vazio válido, potencialmente cercado por espaços. (enfase adicionada)

A seção citada na resposta do mercator é um requisito para implementações , não autores . Os autores devem seguir os requisitos do autor. Para citar Como ler esta especificação :

Em particular, existem requisitos de conformidade que se aplicam aos produtores, por exemplo, autores e documentos que eles criam, e há requisitos de conformidade que se aplicam aos consumidores, por exemplo, navegadores da Web. Eles podem ser distinguidos pelo que estão exigindo: um requisito para um produtor indica o que é permitido, enquanto um requisito para um consumidor indica como o software deve agir.

A alteração do HTML4 - que permitiu um URL vazio - foi feita porque "os navegadores fazem coisas estranhas com um action=""atributo vazio ". Considerando o motivo da alteração, é provavelmente melhor também não fazer isso no HTML4.

derobert
fonte
Permite que a ausência total do actionatributo indique o formulário a ser enviado ao endereço do documento? Parece que, como diz, "se especificado".
Kerrick
2
@ Kerrick Sim, acredito que o HTML5 permite omitir completamente o atributo action e o padrão é string vazia. HTML4 não, especifica a ação conforme necessário.
derobert
Concordo com o @Kerrick, é permitido omitir o atributo action. Lendo o rascunho atual do HTML5, parece que uma string vazia não é permitida, mas a ausência do atributo é permitida. Mas, em qualquer caso, por motivos de compatibilidade, recomendo que você sempre inclua o atributo "action" e preencha-o com um URL não vazio válido (as boas práticas são sempre a melhor maneira).
serfer2
Um possível problema: o AngularJS impedirá o envio de formulários sem um atributo de ação. Provavelmente não é um problema comum, mas demorei um pouco para descobrir por que partes do nosso site herdado começaram a quebrar.
Asmor
18

A não inclusão do atributo action abre a página para ataques de iframe clickjacking , que envolvem algumas etapas simples:

  • Um invasor agrupa sua página em um iframe
  • O URL iframe inclui um parâmetro de consulta com o mesmo nome que um campo de formulário
  • Quando o formulário é enviado, o valor da consulta é inserido no banco de dados
  • As informações de identificação do usuário (email, endereço etc.) foram comprometidas

Referências

Paul Sweatte
fonte
2
O URL do iframe não contém parâmetros GET, enquanto os formulários geralmente são enviados usando POST? Portanto, se o site lida apenas com os parâmetros POST, não deve ser um problema, não é? Pelo menos eu costumo usar a matriz $ _POST no PHP apenas ao processar formulários.
Calmarius
2
@Calmarius Sim, use em $_POSTvez de $_REQUESTevitar isso. Se o código da estrutura for usado $_REQUEST, use um iframe buster .
Paul Sweatte 22/03/2015
17

Isso será validado com HTML5.

<form action="#">

fonte
4
Eu ainda não tentei, mas conceitualmente não rolaria para o topo da página após o envio?
Matt Mitchell
2
Você não poderia usar action="."?
S427
3
action = "?" funciona bem também. Ele valida e aponta para a página atual sem e consulta os dados da string.
Chris Broski
5
action="."é uma má ideia para o caso geral. Um URL como example.com/loginé mapeado apenas example.com/.
Torsten Bronger
1
Esta resposta é válida apenas se o usuário desejar rolar para o topo da página.
Buts
9

No HTML 5 action=""não é suportado, portanto, não faça isso. PRÁTICA MAU.

Se, em vez disso, você negar completamente a ação, ela será submetida à mesma página por padrão, acredito que esta é a melhor prática:

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

Se você estiver submetendo o formulário usando o php, considere o seguinte. Leia mais sobre isso aqui.

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

Como alternativa, você pode #ter em mente que isso funcionará como uma âncora e rolará para o topo da página.

<form action="#">
Buts
fonte
Gostaria de entender por que alguém votou negativamente nesta resposta?
Buts
Você omite o atributo action, o formulário ainda aberto às explorações está detalhado na primeira página do link?
Richard Young
@RichardYoung Desculpe, não entendi sua pergunta. Por favor, reformule.
Buts
1
A variável $ _SERVER ["PHP_SELF"] pode ser usada por hackers. Se PHP_SELF for usado em sua página, um usuário poderá inserir uma barra (/) e alguns comandos XSS (Cross Site Scripting) para executar. Se você omitir o atributo action, você ainda está vulnerável a isso?
Richard Young
Sim você é. O atributo action pode ser adicionado novamente no lado do cliente e com qualquer valor de escolha. No entanto, o uso da htmlspecialchars()função impede que outras pessoas usem seu script php contra você.
Buts
4

Eu normalmente uso action = "", que é válido para XHTML e retém os dados GET no URL.

Juddling
fonte
4
Raramente, mas por exemplo, no meu fórum, eu teria o URL: thread.php? Id = 12 & page = 6 e há um formulário POST na parte inferior da página para adicionar comentários, e eu preciso dos dados GET para que o PHP sabe a qual thread adicionar o comentário.
Julgando 15/07/2009
20
GET é o método padrão para formas - é quase uma coisa ruim ;-) w3.org/TR/html401/interact/forms.html#adef-method
NickFitz
5
Usar GET em formulários é uma coisa ruim. Se o usuário recarregar a página após o envio, poderá haver consequências não intencionais. No entanto, se um POST for usado, o navegador avisará sobre o reenvio dos mesmos dados.
Will Sheppard
22
@WillSheppard Eu discordo. Você não pode fazer uma declaração geral assim. Tudo depende do que o formulário faz. Você deve usar o POST para qualquer coisa que execute uma ação (por exemplo, inserir uma nova postagem em um fórum), mas GET para todo o resto (por exemplo, uma caixa de pesquisa ou usar formulários para navegação). Após um POST bem-sucedido, o script deve redirecionar o navegador para impedir que o usuário reenvie os dados.
Mike
3
PS nem todos os navegadores avisar o usuário sobre reenviá dados POST (por exemplo, ópera)
Mike
4

Eu acho que é melhor declarar explicitamente onde o formulário é postado. Se você quiser ser totalmente seguro, digite o mesmo URL em que o formulário está no atributo action, se desejar que ele seja enviado novamente. Embora os navegadores convencionais avaliem ""a mesma página, você não pode garantir que navegadores não convencionais o farão.

E, é claro, a URL inteira, incluindo dados GET, como Juddling, aponta.

Will Morgan
fonte
2

Apenas use

?

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

Não viola os padrões HTML5.

M_R_K
fonte
Não diminuí a votação, mas seu método eliminará todos os getparâmetros. Um formulário no seguinte URL seria interrompido example.com/update_user?user_id=1porque o formulário será enviado paraexample.com/update_user?
vikki
1

Eu costumava fazer isso muito quando trabalhava com o ASP clássico. Geralmente eu o usava quando era necessário algum tipo de validação no servidor para a entrada (antes dos dias do AJAX). A principal desvantagem que vejo é que ela não separa a lógica de programação da apresentação, no nível do arquivo.

busse
fonte
1
Por que não? Eu acho que não está conectado. Posso fazer com que um formulário publique os dados na mesma página e construa esta página com a separação adequada do controlador e da visualização.
Markus
1

Eu uso para não especificar nenhum atributo de ação. Na verdade, é como minha estrutura é projetada para que todas as páginas sejam enviadas exatamente no mesmo endereço. Mas hoje eu descobri o problema. Às vezes, empresto o valor do atributo action para fazer alguma chamada em segundo plano (acho que algumas pessoas os chamam de AJAX). Então, descobri que o IE mantém o valor do atributo de ação como vazio se o atributo de ação não foi especificado. É um pouco estranho no meu entendimento, pois se nenhum atributo de ação for especificado, a contraparte do JavaScript deverá ser pelo menos indefinida. De qualquer forma, meu argumento é que, antes de escolher as melhores práticas, você precisa entender mais o contexto, como usará o atributo em JavaScript ou não.

Singagirl
fonte