【问题标题】:Will bad things happen if I control the content of $_POST?如果我控制了$_POST的内容,会不会有不好的事情发生?
【发布时间】:2011-04-01 22:58:32
【问题描述】:

在我编写 Web 应用程序的日子里,我缺少一种简单的方法,让 PHP 脚本在传递数据时直接指向另一个 PHP 脚本不使用 URL

浏览器可以使用 $_POST 数组以不可见的方式将数据传递给 PHP 脚本。所以我正在设计一个脚本,它将 $_SESSION["POST"] 的内容转储到 $_POST 数组中以模拟发布数据的传递,然后清除 $_SESSION["POST"]。

例如,页面 X 包含登录表单。页面 X 指向页面 Y 以验证数据。页面 Y 发现登录信息不正确,并重定向回页面 X - 现在显示来自 $_POST 的错误消息“登录信息不正确”。

我是不是因为错过了这个功能而疯狂?还有其他一些我想念的轻松做到这一点的方法吗?

请回复任何可能有帮助的内容。

【问题讨论】:

  • 也许你可以只包含那个 PHP 文件而不是重定向到另一个页面?
  • 您是否打算修改当前的$_POST 数组,然后包含()另一个脚本?还是您打算使用 POST 数据发出重定向? (自动提交表单)
  • 由于这是一个 MVC 应用程序,所有页面都具有相同的访问点。我打算在每个页面加载时检查 $_SESSION["POST"] 中的数据并将其转储到 $_POST 数组中。

标签: php forms post login


【解决方案1】:

您可以使用会话。在第 X 页上,您将数据放入会话中。在 Y 页上,您将验证数据并处理重定向。您也可以将错误消息放入会话中。

会话在请求之间持续存在,因此它是存储此类数据的理想场所。

编辑

好的,我会处理会话变量,但如果您想避免这种情况,除了发布之外,您还有其他一些我能想到的选择:

  1. 您可以使用服务器上的文件(例如临时文件)。使用用户的会话密钥来识别哪个文件是他们的,您可以读取和写入您关心的任何数据。
  2. 您可以将数据放入数据库中。那也行。

当然,这些都不是真正的帖子。如果你想要一个真实的帖子,你还有另外两个选择。

  1. 首先,您可以将数据以隐藏的形式返回到页面,并使用JavaScript触发POST。这很简单,但它需要数据通过浏览器。这意味着您必须注意用户没有更改数据,并且用户必须启用 JavaScript。您可以对数据进行校验和以确保它没有被修改,但是 JavaScript 问题是无法解决的。

  2. 另一种方法是将用户完全排除在外。当用户提交到页面 A 时,页面 A 可以对页面 B 进行 POST,检查响应,然后将用户重定向到正确的位置。这就像您必须对第三方服务进行 JSON 或 SOAP 调用一样,除非您控制该服务。已经有一段时间了,但我相信 HttpRequest 是用于执行此操作的类。

如果您检查的 URL 返回一个简单的答案(“true”、“false”、“yes”、“no”、“good”、“bad”等),那将是理想的,但只要您可以通过响应判断他们是否成功,你可以做到。

现在我应该注意,我同意 mvds,这听起来像是一个应该包含在页面 A 中的函数,以便它可以完成所有工作,但代码可以与其他页面共享。让页面 A 发布到页面 B 然后重定向到 A 或 C 似乎不必要地复杂。 Page A 可以轻松完成这一切。我阅读了您对他的回答的评论,但似乎应该有另一种方法来实现这一点。

【讨论】:

  • 我想要的是将数据从一个页面传递到另一个页面,不是永远保存会话中的数据。如果我只是为此使用会话,则每次使用它们时都必须从会话中清除使用的变量。将所有内容转储到$_POST 中会不会更简单,它会在页面显示后自行清除?
  • @Codemonkey 也许我遗漏了一些东西,但我没有看到问题;无论是多页注册表单还是简单的登录表单,您都可以在成功注册/登录等后轻松取消设置特定会话变量。
  • 问题的重点是一种无需管理会话变量即可将数据从一个 PHP 脚本传递到另一个脚本的方法。容易与否,它增加了很多代码。在我看来,将代码保持在最低限度是好的。感谢您的回答,但我正在寻找的并不是真正明显的方法,而是有关按照我的方式进行操作的后果的信息。例如,有充分的理由不按我的方式做吗?
  • 您的解决方案编号 2:2 是我建议的解决方案,但是当我可以自己设置 $_POST 变量时,为什么使用 HttpRequest 会遇到这么多麻烦呢?
【解决方案2】:

将执行的动作抽象为函数和/或类,这样的组合的需求就会消失。具体:页面 X 和 Y 都可以调用同一个函数来验证发布的登录数据。

页面 X 重定向到页面 Y 进行验证意味着将控制权交还给客户端,而您可以(并且应该)立即验证数据。

【讨论】:

  • 我的应用程序中的所有内容都抽象为类和方法。这并没有改变我的问题。
  • 我假设页面 Y 只做一个像 validate($_POST) 这样的调用?为什么不从第 X 页调用呢?
  • 没那么简单。 Page X 是我的用户面板控制器中称为登录的功能。处理验证的函数是我的用户控制器中的函数登录。由于方法是通过URL访问的,因为我想将业务逻辑从模板中分离出来,所以我这样做了。
猜你喜欢
  • 2022-06-22
  • 2019-05-20
  • 1970-01-01
  • 2013-08-11
  • 1970-01-01
  • 1970-01-01
  • 2017-06-21
  • 1970-01-01
  • 2015-03-04
相关资源
最近更新 更多