【问题标题】:PHP: reasons to use GET and POST request at the same time? [closed]PHP:同时使用 GET 和 POST 请求的原因? [关闭]
【发布时间】:2013-08-09 19:17:24
【问题描述】:

我正在审查一个系统(一个旧系统),在某些情况下,它们使用 POST 方法以表单形式发送数据,但它们也向 url 发送参数,就像使用 get 一样。

类似这样的:

echo "\n<FORM METHOD='POST' NAME='onegroup' ACTION='menu.php?sesion=".$sesion."' >
    <INPUT TYPE='HIDDEN'    NAME='sesion'   VALUE='".$sesion."'>
    <INPUT TYPE='HIDDEN'    NAME='index_login'   VALUE='1'>
[...]   
</FORM>\n";

(注意,sesion 不是拼写错误,只是西班牙语中的“会话”一词)

发生的情况是“sesion”参数同时通过 url 和输入字段发送,因此,“sesion”变量随后在$_POST 数组和$_GET 数组中都被接收。

为什么这是必要的,我应该这样吗?还是我可以将其从 url 中删除并仅依赖 $_POST 数据?

我在 cmets 中阅读了 this 的答案,从 GET 和 POST 发送数据是完全可能和有效的(尽管在这种情况下方法本身只是 GET 或 POST(或其他)是 POST,因为这是表单定义的方式)。现在在这种特定情况下,为什么有人要通过 get(通过 url)和 post 请求发送相同的 sesionvariable(即具有相同的值)?

在我的 menu.php 脚本中,$_POST$_GET 都可以读取,并且每个都有其变量的“版本”,但它恰好是相同的。 我也玩过,看到如果不是 $_POST 或 $_GET 我读取 $_REQUEST 数组,我将所有变量放在一起,但对于重复的变量 (sesion),post 版本获得优先权。

另一件事是他们依赖“注册全局”选项,因此,他们没有明确使用$_GET["sesion"]$_POST["sesion"](甚至$_REQUEST[]),而是在任何地方使用'$sesion'来使用该信息(对于请求中的任何其他变量也是如此)。再次,玩弄,我看到在这种情况下,变量的 POST 版本也优先。但是我可以一直依赖它吗?

我应该只使用post方法并从url中删除参数吗?

他们为什么要这样做而不是通过邮寄方式发送所有内容?正如我所看到的,没有理由同时使用两者,特别是因为两者都具有相同的值。如果他们不这样做,他们可以选择使用哪个版本,但事实并非如此,我想不出其他任何东西,这只是他们留在那里并且从未“修复”的东西

在哪些“现实生活”示例中,有人需要将这种场景用于 POST 和 GET 请求,特别是在两者中使用相同的变量名?

谢谢。

【问题讨论】:

    标签: php request http-post httprequest http-get


    【解决方案1】:

    如果值相同,您应该删除其中一个(最好是 GET)。但是,您还需要确保对表单处理逻辑进行相应的更改,以便代码获得它所期望的值。最好使用 $_POST 或 $_GET 代替 $_REQUEST,因为这样您就可以明确地知道您正在传递什么值以及您的代码期望什么值。例如,如果您使用 $_REQUEST,那么您的 POST 值可能会被 GET 覆盖,这可能是一个安全问题。此外,依赖寄存器全局变量也不是一个好主意,因为这也可能导致安全问题,而且寄存器全局开/关设置可能因服务器而异。至于为什么有人会这样做,可能是错误或对 PHP GET/POST 的工作方式缺乏了解。

    For a real life scenario:
    

    对于我的许多应用程序,我使用会话并将 php session_id 作为 GET 参数在 url 中逐页传递。每个页面还需要一个“verify.php”来验证会话并检查用户是否登录。如果我正在处理表单,那么我只需创建表单并将操作部分指定为:

    action="form_submit_page.php?SID=<?php echo Session_ID(); ?>"
    

    表单以 POST 方式将值从一个页面传递到另一页面,而操作部分以 GET 方式传递会话。

    【讨论】:

    • 我知道应该使用 $_POST 或 $_GET,问题是它们依赖于寄存器全局变量,因此它们既不使用也不使用 $_REQUEST。到目前为止,我们已经控制了服务器,并且可以控制该标志始终处于打开状态(以及 php 版本,我们将其保持在 5.3,因此我们可以精确地依赖它)我将删除该特定的 GET 版本变量并希望不会影响某些事情。
    • 如果这对你有用,那么它就可以(虽然可能不是很安全)。您可能还想研究一下:stackoverflow.com/questions/1417373/…
    • 关于答案的更新,这正是他们所做的!他们将会话 ID 作为 url 中的参数传递,但为什么要这样做?为什么不直接在 POST 请求中发送呢?我的意思是,为什么它必须在 GET 而不是 POST 中?或者为什么要发送它?无论如何,php 不会“传播”会话吗?这就是 $_SESSION 和 session_ID() 的意义所在,对吧?如果它被存储,为什么你需要通过 url 传播它?
    • 是的,我知道注册全局变量是一个坏主意,但这就是系统的制作方式。如果它取决于我,我会消除它,但不幸的是,它需要大量工作来检查每个脚本并改用正确的 $_GET 或 $POST 变量。我会研究一下,以说服这里的人们停止依赖它!谢谢 =)
    • 他们以我的方式(以及“他们”的方式)只是一种方式。同样可以通过cookies来实现。我需要在页面之间传递会话 ID 的原因是检查用户是否已登录,因为我们使用的是一个不特定于我的应用程序的全局登录系统。该系统严重依赖 php 会话。理想情况下,您希望通过 POST,只传递您计划在表单中使用的内容。通过将会话 ID 保留在 GET 中代替 POST,我的代码是统一的,因为并非所有页面都是从一个页面传递到另一个页面的表单。
    【解决方案2】:

    我使用查询字符串参数 (GET) 来选择活动页面并使用 POST 值来携带表单数据。这有一个合法的用例。

    如果数据是重复的,则终止 GET。

    【讨论】:

    • 我还使用查询字符串而不是视图状态来使某些设置变量保持不变,并允许我以编程方式操作打开或刷新页面的设置。这种类型的过程通常与表单提交是分开的,因此可以同时使用 get 和 post。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多