【问题标题】:When posting info from a form, is it better to use $_REQUEST or $_POST?从表单发布信息时,使用 $_REQUEST 还是 $_POST 更好?
【发布时间】:2010-09-19 09:37:25
【问题描述】:

我有一个表单,用户可以输入他们的姓名,然后它会将其添加到 $message 以通过电子邮件发送。

使用$_POST 还是$_REQUEST 哪个更好?

这是使用$_REQUEST的sn-p

$message.= "Name: ".$_REQUEST["fname"]." ".$_REQUEST["mname"]." ".$_REQUEST["lname"]."\n";

【问题讨论】:

    标签: php


    【解决方案1】:

    我过去的方法是使用 $_REQUEST 来处理我认为是大错误的所有事情。最近,我一直在尝试更加努力地将 GET 仅用于读取请求,将 POST 仅用于写入请求。

    为此,我认为使用 $_GET 处理 GET 请求和 $_POST 处理 POST 请求可以让我的代码中的意图更加清晰。

    【讨论】:

      【解决方案2】:

      答案是:这取决于您希望如何使用它。

      如果您使用的是$_POST,这意味着它只能通过 POST 进入。 如果您使用$_REQUEST,则表示您接受 POST、GET(和 COOKIE,但主要是我们感兴趣的前两个)。

      对于这样的事情,$_POST 可能会更整洁,但如果您正在制作搜索引擎,允许设置搜索 URL 可能是一个好主意。但是,您可能希望允许大量特殊参数来缩小搜索范围,如果这会占用大量 URL 空间,您可能还希望允许 POSTDATA。

      正如 Dylan 所提到的,请记住,两者都不能替代任何类型的安全性。

      【讨论】:

      • 我可以做些什么来让我的表单更安全?
      • 在电子邮件的上下文中,您需要注意电子邮件注入:简短的版本是您不能允许用户使用 \r 或 \n除了消息本身之外的任何地方。其他安全措施适用于数据库访问(SQL 注入)和将在 Web 浏览器 (XSS) 中显示的内容。
      【解决方案3】:

      不管你用哪一个。只需确保对表单使用某种形式的安全性即可。

      【讨论】:

        【解决方案4】:

        我刚刚收听了Security Now 第 166 集,这完全是关于跨站点请求伪造的,在其中,Steve 很好地说明了使用 $_POST 而不是 $_REQUEST 的形式。 (间接地,他没有谈论 PHP 本身,但确实说您不应该同时接受 GET 和 POST 的表单。)原因是使用 GET 请求进行 CSRF 攻击很容易,但使用 POST 并不那么容易。

        使用$_POST 本身并不能消除 CSRF 攻击的可能性,但它确实减少了它。 Steve 还建议在请求中使用加密性强的伪随机隐藏字段,以消除“盲目”请求的可能性。

        【讨论】:

          【解决方案5】:

          _POST 如果数据正在某处更新(即如果操作有副作用),_REQUEST 否则,如果您不关心数据是否通过 GET、POST、或任何其他方法。

          【讨论】:

            【解决方案6】:

            除非您有充分的理由不这样做(例如 Michael 提到的搜索引擎),否则最好对各自的方法使用 $_GET 和 $_POST 而不是 $_REQUEST,以避免任何歧义或混淆可能在 GET 和 POST 数据中具有相同的参数名称。

            【讨论】:

              【解决方案7】:

              我唯一使用 $_REQUEST 的时候是我需要能够支持来自 $_POST 或 $_GET 的数据。

              例如,如果我有一个应该修改记录的表单,我最初可能会将 url 中的记录 ID 作为 id=X 传递。因此,当第一次加载表单时,我可以使用 $_GET['id'] 来确定我们要修改的记录。

              但是,当提交修改操作时,表单应该是 POST 的,因为它会改变数据并且不是幂等的。在这种情况下,在处理表单提交时,记录 ID 可以作为 $_POST['id'] 访问。

              但是,如果表单提交中出现错误并且我需要重新加载表单并显示有用的错误消息,会发生什么?在这种情况下,表单生成代码需要通过查看不在 URL 中的 POSTed id 来确定要使用的记录。

              在这种情况下,我会在表单显示逻辑中使用 $_REQUEST['id'],这样它就可以支持任何一种情况。但是对于表单处理,我会使用 $_POST['id'] 进行严格检查。

              【讨论】:

                猜你喜欢
                • 2010-11-19
                • 1970-01-01
                • 2013-07-23
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2023-04-03
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多