为HTML表单的action属性使用空的URL是一个好习惯吗? (动作=“”)

我想知道是否有人可以给“最佳做法”的回应,使用空白HTML表单操作回发到当前页面。

有一个post询问一个空白的HTML表单动作在这里做了什么 ,一些这样的页面表明这是好的,但我想知道人们的想法。

您可以做的最好的事情是完全省略动作属性。 如果不填写,表单将被提交到文档的地址,即相同的页面。

也可以将其保留为空,任何实现HTML表单提交algorithm的浏览器都会将其视为等同于文档地址,这主要是因为浏览器目前的工作原理:

8.让行动成为提交者的行为 。

9.如果action是空string,则让action为文档的地址 。

注意:这一步是故意违反 RFC 3986,这将需要在这里进行基本的URL处理。 这种违规行为是出于对传统内容兼容性的渴望。 [RFC3986]

这绝对适用于所有当前的浏览器,但在某些旧浏览器中可能无法按预期工作( “ 浏览器使用空的action =”“attribute ” 做奇怪的事情 ),这就是为什么规范强烈地阻止作者将它留空的原因 :

如果指定了actionformaction内容属性,则其值必须是可能被空格包围的有效非空URL 。

实际上,当前HTML5草稿的表单提交子部分不允许action="" 。 这是违反规范。

如果指定了actionformaction内容属性,则其值必须是可能被空格包围的有效非空 URL。 (强调加)

mercator的答案中引用的部分是对实现的要求,而不是作者 。 作者必须遵循作者的要求。 引用如何阅读这个规范 :

特别是适用于生产者的一致性要求,例如作者和他们创build的文档,以及适用于消费者的一致性要求,例如Web浏览器。 他们可以根据他们的要求加以区分:对生产者的要求声明允许的内容,而对消费者的要求声明软件如何行事。

因为“ 浏览器用一个空的action=""属性 ” 来做怪异的事情,所以HTML4的改变确实允许一个空的URL。 考虑到更改的原因,最好不要在HTML4中做到这一点。

这将validation与HTML5。

 <form action="#"> 

不包括action属性会打开iframe点击劫持的页面,这涉及到几个简单的步骤:

  • 攻击者将您的页面封装在iframe中
  • iframeurl包含一个与表单域名称相同的查询参数
  • 提交表单时,将查询值插入到数据库中
  • 用户的识别信息(电子邮件,地址等)已被泄露

参考

  • 利用ClickJacking和HTTP参数污染绕过CSRF保护

我通常使用action =“”,这是XHTML有效,并保留在URL中的GET数据。

我认为最好是明确指出表单发布的位置。 如果您想要完全安全,请在action属性中input表单所在的URL,如果您希望将其提交回自己。 虽然主stream浏览器评估""到同一页面,但不能保证非主stream浏览器能够。

当然,像Juddling这样的包含GET数据的整个URL都指出了。

IN HTML 5 action=""不支持,所以不要这样做。 不好的做法。

如果相反,你完全否定行动,它会默认提交到同一页面,我相信这是最好的做法:

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

如果你正在使用PHPforms,你可能需要考虑以下几点。 在这里阅读更多。

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

另外,你可以使用#记住,但是这将像一个锚点,并滚动到页面的顶部。

 <form action="#"> 

当我使用经典的ASP时,我曾经做过很多。 通常我使用它时需要服务器端validation某种types的input(在AJAX的日子之前)。 我所看到的主要缺点是,在文件层面上,它并没有将编程逻辑从表示中分离出来。

只是使用

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

它不违反HTML5标准。

我用来根本不指定动作属性。 实际上,我的框架是如何devise的,所有的页面都被提交回同一个地址。 但今天我发现了问题。 有时我借用动作属性值来做一些背景调用(我想有人把它们命名为AJAX)。 所以我发现如果action属性没有指定,IE会保持action属性值为空。 我的理解有点奇怪,因为如果没有指定action属性,那么JavaScript的对应必须至less是未定义的。 无论如何,我的观点是,在你select最佳实践之前,你需要了解更多的上下文,就像在JavaScript中使用属性一样。