将空URL用作HTML表单的action属性是否是一种好习惯?(操作=“”)


279

我想知道是否有人可以使用空白HTML表单操作将其发布回当前页面,从而给出“最佳实践”响应。

这里有一篇帖子问空白的HTML表单动作是做什么的,并且像这样的一些页面表明它很好,但是我想知道人们的想法。


7
建议将“最佳做法”标签应用于此。
威尔·摩根(Morgan Morgan)2009年

要双重确认,请将操作留空,或者根本不提及任何操作(例如<form name="xyz" >)。它将自行提交操作。
lwpro2 2011年

11
不包括action属性将使页面最多受iframe clickjacking攻击,例如,攻击者将您的页面包装在iframe中,而iframe URL包含与表单字段同名的查询参数。提交表单后,查询值将插入到数据库中,因此用户的标识信息(电子邮件,地址等)已被破坏。
保罗·史威特

那么,向当前页面提交表单的有效,安全的方法是什么?
哥斯达黎加

Answers:


268

您可以做的最好的事情就是完全忽略action属性。如果不填写,表格将被提交到文档的地址,即同一页面。

也可以将其保留为空,并且任何实现HTML表单提交算法的浏览器都将其视为等同于文档的地址,这主要是因为浏览器当前的工作方式是:

8.让action作为Submitter元素的action

9.如果action为空字符串,则让action为文档的地址

注意:此步骤是对RFC 3986 的故意违反,这将需要在此处处理基本URL。这种侵犯是由于希望与遗留内容兼容而引起的。[RFC3986]

这绝对适用于所有当前浏览器,但可能无法在某些较旧的浏览器中正常工作(浏览器使用空的action =“” attribute来做奇怪的事情,这就是该规范强烈劝阻作者不要将其留空的原因

actionformaction内容属性,如果指定,必须有一个值是一个有效的非空URL用空格潜在的包围


12
自您回答以来(已经过去了将近三年),这可能已经改变,但是从今天起,HTML5不允许action=""-请参阅我的回答...
derobert 2012年

2
@derobert谢谢。这可能没有改变。我更改了答案,以更好地反映规范的内容。
墨卡托

73

实际上,当前HTML5草案的“ 表单提交”小节不允许action=""。这违反规范。

actionformaction内容属性,如果指定,必须有一个值是一个有效的非空 URL用空格潜在的包围。(添加了重点)

墨卡托答案中引用的部分是对实现的要求,而不是作者的要求。作者必须遵守作者的要求。引用如何阅读本规范

特别是,存在适用于生产者(例如作者及其创建的文档)的一致性要求,并且存在适用于消费者(例如Web浏览器)的一致性要求。它们可以通过其需求来区分:对生产者的要求说明了允许的内容,而对消费者的要求说明了软件的行为方式。

之所以对HTML4进行了更改(确实允许使用空的URL),是因为“ 浏览器使用空的action=""属性来做奇怪的事情 ”。考虑到更改的原因,最好不要在HTML4中也这样做。


是否允许完全不存在该action属性以指示该表单应提交到文档地址?因为它说的是“如果指定”。
Kerrick 2012年

2
@Kerrick是的,我相信HTML5允许完全省略action属性,并将其默认为空字符串。HTML4没有,它根据需要指定操作。
derobert 2012年

我同意@Kerrick,可以省略action属性。在当前的HTML5 draf上阅读,似乎不允许使用空字符串,但允许缺少该属性。但是无论如何,出于兼容性的原因,我建议您始终包括“ action”属性,并用有效的非空URL进行填充(最佳做法始终是最佳方法)。
serfer2 2014年

一个潜在的难题:AngularJS将阻止没有动作属性的表单提交。可能不是一个常见的问题,但是花了我一段时间才弄清楚为什么旧站点的某些部分开始崩溃。
阿斯莫尔

18

如果不包含action属性,则会打开该页面以进行iframe clickjacking攻击,其中涉及一些简单的步骤:

  • 攻击者将您的页面包装在iframe中
  • iframe URL包含与表单字段同名的查询参数
  • 提交表单后,查询值将插入数据库中
  • 用户的标识信息(电子邮件,地址等)已被泄露

参考资料


2
iframe URL是否不包含GET参数,而表单通常是使用POST提交的?因此,如果该站点仅处理POST参数,那应该不是问题,不是吗?至少我通常仅在处理表单时才在PHP中使用$ _POST数组。
Calmarius

2
@Calmarius是的,请使用$_POST代替$_REQUEST以避免这种情况。如果使用框架代码$_REQUEST,请使用iframe克星
Paul Sweatte

17

这将使用HTML5进行验证。

<form action="#">

4
我没有尝试过,但是从概念上讲,提交后不会滚动到页面顶部吗?
马特·米切尔

2
你不能用action="."吗?
s427 2013年

3
action =“?” 也很好。它在没有和查询字符串数据的情况下验证并指向当前页面。
克里斯·布罗斯基

5
action="."对于一般情况来说是个坏主意。像这样的URL example.com/login仅映射到example.com/
Torsten Bronger 2014年

1
仅当用户要滚动到页面顶部时,此答案才有效。
Buts 2013年

9

HTML 5中action=""不支持,因此请勿这样做。坏习惯。

相反,如果您完全完全取消操作,则默认情况下它将提交到同一页面,所以我认为这是最佳做法:

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

如果使用php汇总表格,则可能需要考虑以下内容。在这里阅读更多有关它的信息。

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

另外,您可以#记住,尽管这会像锚一样,并滚动到页面顶部。

<form action="#">

想了解为什么有人不赞成这个答案吗?
Buts

您忽略了action属性,链接的第一页上详细说明了该表格是否仍对漏洞利用开放吗?
理查德·杨

@RichardYoung对不起,我不明白你的问题。请改写。
的击打

1
$ _SERVER [“ PHP_SELF”]变量可由黑客使用。如果在页面中使用PHP_SELF,则用户可以输入斜杠(/),然后输入一些跨站点脚本(XSS)命令来执行。如果省略action属性,您仍然容易受到此攻击吗?
理查德·杨

是的,你是。可以将action属性添加回客户端并提供任何选择值。但是,使用该htmlspecialchars()功能可以阻止人们对您使用php脚本。
Buts

4

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


4
很少,但是例如,在我的论坛中,我会有URL:thread.php?id = 12&page = 6,页面底部有一个POST表单用于添加注释,并且我需要GET数据,因此PHP知道要添加注释的线程。
2009年

20
GET是表单的默认方法-这不是一件坏事;-) w3.org/TR/html401/interact/forms.html#adef-method
NickFitz

5
在表单中使用GET 一件坏事。如果用户在提交后重新加载页面,则可能会有意想不到的后果。但是,如果使用POST,浏览器将警告您重新提交相同的数据。
Will Sheppard

22
@WillSheppard我不同意。您不能像这样发表笼统的声明。这完全取决于表单的功能。您应该将POST用于执行某项操作的任何内容(例如,在论坛中插入新帖子),而将GET用于其他所有内容(例如,搜索框或使用表单进行导航)。POST成功后,脚本应重定向浏览器,以防止用户重新提交数据。
Mike

3
PS并非所有浏览器都会警告用户重新提交POST数据(例如Opera)
Mike

4

我认为最好明确声明表单的发布位置。如果您想完全安全,则要在表单中将表单提交回自身,请在action属性中输入与表单相同的URL。尽管主流浏览器评估""是相同的,但您不能保证非主流浏览会相同。

当然,整个URL包括Juddling之类的GET数据也会指出。


2

只需使用

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

它不违反HTML5标准。


我没有拒绝投票,但是您的方法将删除所有get参数。以下网址上example.com/update_user?user_id=1的表格可能会example.com/update_user?
损坏,

1

当我使用Classic ASP时,我经常这样做。通常,当需要某种形式的服务器端验证作为输入时(在AJAX时代之前),我会使用它。我看到的主要缺点是,它没有在文件级别将编程逻辑与表示分离开来。


1
为什么不?我认为它没有连接。我可以有一个将数据发布到同一页面的表单,并使用控制器和视图的适当分隔来构建此页面。
markus

1

我以前根本不指定动作属性。实际上是我的框架的设计方式,所有页面都精确地提交回相同的地址。但是今天我发现了问题。有时,我借用动作属性值来进行一些后台调用(我猜有些人将其命名为AJAX)。因此,我发现如果未指定动作属性,IE会将动作属性值保持为空。根据我的理解,这有点奇怪,因为如果未指定action属性,则JavaScript对应项至少必须未定义。无论如何,我的意思是选择最佳实践之前,您需要了解更多上下文,例如是否在JavaScript中使用该属性。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.