对 HTML 表单的 action 属性使用空 URL 是一种好习惯吗? (动作="")
Posted
技术标签:
【中文标题】对 HTML 表单的 action 属性使用空 URL 是一种好习惯吗? (动作="")【英文标题】:Is it a good practice to use an empty URL for a HTML form's action attribute? (action="") 【发布时间】:2010-11-11 00:48:11 【问题描述】:我想知道是否有人可以对使用空白 html 表单操作回发到当前页面给出“最佳实践”响应。
有a post asking what a blank HTML form action does here 和一些像this one 这样的页面表明这很好,但我想知道人们的想法。
【问题讨论】:
建议应用“最佳实践”标签。 要双重确认,请将操作留空,或者根本不提及操作(如<form name="xyz" >
)。它将自行提交操作。
不包括 action 属性打开页面时会遇到iframe clickjacking 攻击,例如攻击者将您的页面包装在 iframe 中,并且 iframe URL 包含与 a 同名的查询参数表单域。提交表单时,查询值被插入到数据库中,因此用户的身份信息(电子邮件、地址等)已被泄露。
那么,将表单提交到当前页面的有效、安全的方式是什么?
不包括action属性也是无效的HTML。它在规范中作为必需属性。空操作也有自己的怪癖:***.com/a/617197/1307074。
【参考方案1】:
当您放置空操作时,某些安全过滤会认为它是恶意的或网络钓鱼。因此,他们可以阻止您的页面。因此建议不要将 action= 保留为空白。
【讨论】:
【参考方案2】:不支持在 HTML 5 中 action=""
,所以不要这样做。不好的做法。
如果您完全否定操作,默认情况下它将提交到同一页面,我相信这是最佳做法:
<form>This will submit to the current page</form>
如果您使用 php 提交表单,您可能需要考虑以下事项。 read more about it here.
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
您也可以使用#
,但请记住,这将起到锚点的作用并滚动到页面顶部。
<form action="#">
【讨论】:
想了解为什么有人对这个答案投了反对票? 你省略了action属性,表单是否仍然对漏洞开放在链接的第一页有详细说明? @RichardYoung 对不起,我不明白你的问题。请改写。 $_SERVER["PHP_SELF"] 变量可以被黑客使用。如果在您的页面中使用 PHP_SELF,则用户可以输入斜杠 (/),然后输入一些跨站点脚本 (XSS) 命令来执行。如果你省略了 action 属性,你是否仍然容易受到这个影响? 是的,你是。 action 属性可以添加回客户端并给出任何选择值。但是,使用htmlspecialchars()
函数可以阻止人们使用您的 php 脚本来对付您。【参考方案3】:
随便用
?
<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?
【参考方案4】:
不包括action属性打开页面最多iframe clickjacking攻击,涉及几个简单的步骤:
攻击者将您的页面包装在 iframe 中 iframe URL 包含一个与表单字段同名的查询参数 提交表单时,将查询值插入到数据库中 用户的识别信息(电子邮件、地址等)已被泄露参考文献
Bypassing CSRF protections with ClickJacking and HTTP Parameter Pollution【讨论】:
iframe URL 不是包含 GET 参数,而表单通常使用 POST 提交吗?因此,如果该站点仅处理 POST 参数,那么它应该不是问题,不是吗?至少我通常只在处理表单时在 PHP 中使用 $_POST 数组。 @Calmarius 是的,使用$_POST
而不是$_REQUEST
来避免这种情况。如果框架代码使用$_REQUEST
,请使用iframe buster。【参考方案5】:
这将通过 HTML5 进行验证。
<form action="#">
【讨论】:
我没试过,但理论上提交后不会滚动到页面顶部吗? 你不能用action="."
吗?
action="?"效果也很好。它验证并指向没有和查询字符串数据的当前页面。
action="."
对于一般情况来说是个坏主意。 example.com/login
之类的 URL 仅映射到 example.com/
。
这个答案只有在用户想要滚动到页面顶部时才有效。【参考方案6】:
我以前根本不指定动作属性。这实际上是我的框架的设计方式,所有页面都被提交回完全相同的地址。但是今天我发现了问题。有时我会借用 action 属性值来进行一些后台调用(我猜有些人将它们命名为 AJAX)。所以我发现如果没有指定动作属性,IE 会将动作属性值保持为空。我的理解有点奇怪,因为如果没有指定动作属性,则 javascript 对应项至少必须是未定义的。无论如何,我的观点是在您选择最佳实践之前,您需要了解更多上下文,例如您是否会在 JavaScript 中使用该属性。
【讨论】:
【参考方案7】:您能做的最好的事情就是完全省略 action 属性。如果您不填写,表单将被提交到文档的地址,即同一页。
也可以将其留空,任何实现HTML's form submission algorithm 的浏览器都会将其视为等同于文档的地址,这主要是因为浏览器当前是这样工作的:
8.
让 action 成为提交者元素的action。
9.
如果 action 为空字符串,则让 action 为 the document's address。注意:此步骤是 RFC 3986 的 willful violation,需要在此处处理基本 URL。这种违规的动机是希望与遗留内容兼容。 [RFC3986]
这绝对适用于所有当前浏览器,但在某些旧浏览器中可能无法正常运行 ("browsers do weird things with an empty action="" attribute"),这就是为什么 the spec strongly discourages authors from leaving it empty:
action
和formaction
内容属性(如果指定)的值必须是 valid non-empty URL potentially surrounded by spaces。
【讨论】:
可能自从您的回答(已经将近三年)以来,这种情况已经发生了变化,但截至今天,HTML5 不允许action=""
——请参阅我的回答...
@derobert 谢谢。这可能没有改变。我已经更改了答案,以更好地反映规范所说的内容。【参考方案8】:
实际上,当前 HTML5 草稿的Form Submission subsection 不允许action=""
。这是违反规范的。
action
和formaction
内容属性(如果指定)的值必须是可能被空格包围的有效非空 URL。 (强调)
mercator's answer 中引用的部分是实现 的要求,而不是作者。作者必须遵守作者要求。引用How to read this specification:
特别是,有适用于生产者的一致性要求,例如作者和他们创建的文档,还有适用于消费者的一致性要求,例如 Web 浏览器。它们可以通过它们的要求来区分:对生产者的要求说明了允许的内容,而对消费者的要求说明了软件的行为方式。
对 HTML4 的更改(允许使用空 URL)是因为“browsers do weird things with an empty action=""
attribute”。考虑到更改的原因,最好不要在 HTML4 中这样做。
【讨论】:
它是否允许完全没有action
属性来指示表单应该提交到文档地址?它似乎,因为它说,“如果指定。”
@Kerrick 是的,我相信 HTML5 允许完全省略 action 属性,并将其默认为空字符串。 HTML4 没有,它根据需要指定操作。
我同意@Kerrick,允许省略 action 属性。阅读当前的 HTML5 草案,似乎不允许空字符串,但允许缺少属性。但无论如何,出于兼容性原因,我建议您始终包含“action”属性并用有效的非空 URL 填充它(好的做法总是最好的方法)。
一个潜在的陷阱:AngularJS 将阻止提交没有 action 属性的表单。可能不是一个常见的问题,但我花了一段时间才弄清楚为什么我们的旧网站的某些部分开始出现问题。
这个答案让我很困惑,当我 6 个月前第一次阅读它时,我认为它是在说接受的答案是错误的。我认为这可能有助于澄清最好将属性排除在外,但如果属性存在,请给它一个非空白值。【参考方案9】:
我认为最好明确说明表单的发布位置。如果您想完全安全,请在 action 属性中输入与表单所在的 URL 相同的 URL,如果您希望它提交回自身。虽然主流浏览器评估""
到同一个页面,但不能保证非主流浏览器也会。
当然,包括像 Juddling 这样的 GET 数据在内的整个 URL。
【讨论】:
【参考方案10】:我在使用 Classic ASP 时经常这样做。通常,当需要对输入进行某种服务器端验证时(在 AJAX 时代之前),我会使用它。我看到的主要缺点是它没有在文件级别将编程逻辑与演示分开。
【讨论】:
为什么不呢?我认为它没有连接。我可以有一个表单将数据发布到同一页面,并通过适当分离控制器和视图来构建此页面。以上是关于对 HTML 表单的 action 属性使用空 URL 是一种好习惯吗? (动作="")的主要内容,如果未能解决你的问题,请参考以下文章