【问题标题】:Hiding $_GET variables by a re-direct通过重定向隐藏 $_GET 变量
【发布时间】:2015-12-07 17:20:47
【问题描述】:

我正在使用需要与我自己的应用集成的第 3 方应用。在第 3 方应用程序中,信息通过表单发布,然后重新定向到我的网站以进行进一步处理。重定向到我的站点将包含我需要从重定向 URL 中的表单获取的变量。但是,我不希望发布表单的用户能够查看这些变量。

如果重定向链接隐藏在第 3 方应用程序中(即不在表单中),那么我认为可行的一种方法是将第 3 方应用程序定向到执行以下操作的“预处理”脚本:

session_start();
$_SESSION['some_variable_to_save'] = $_GET['some_variable_to_save']; //properly sanitized!!
header('Location: where_i_really_want_to_process.php');
exit;

然后,在 where_i_really_want_to_process.php 中,我可以处理会话变量。这是确保用户永远不会看到 $_GET 变量的安全方法吗?

【问题讨论】:

  • 如果你想在没有用户查看的情况下将变量传递到另一个页面,你应该使用POST,而不是GET(尽管这仍然不是万无一失的)。如果他们杀死脚本或他们的互联网在页面之间中断,他们就会看到数据。
  • 不幸的是,我无法控制这一点,因为第 3 部分应用程序使用 _GET 变量向我发送 URL。
  • 您可以改用cURL 并在脚本中执行它,这样就没有重定向了吗?
  • 尝试 ajax 使用 get 传递数据
  • 我无法控制如何将数据发送到我的应用程序;这是购买后的“网络钩子”。我不太确定在这种情况下如何使用 ajax。

标签: php security redirect get


【解决方案1】:

您使用$_SESSION 的建议似乎是唯一的解决方案。

但是,为了让生活更轻松一些,并应对可能发生的任何变化,只需将整个 $_GET 数组放到一个 Session 变量中

session_start();

// dont sanitization here, do it in the where_i_really_want_to_process.php

$_SESSION['previous_GET'] = $_GET;

header('Location: where_i_really_want_to_process.php');
exit;

【讨论】:

  • 听起来这是在他们自己的流程成熟之前要走的路。我将添加您的建议,即把整个阵列放在我的会话中以备不时之需。
  • +1 表示退出(虽然我个人更喜欢 die();)。如果可能的话,我实际上建议不要在这里清理,因为这会将这个文件保留在需求编辑规范更改列表中。但是,一个警告,您可以使用它来将任意数据推送到会话变量中。当然,它受到 URL 规范的限制,不能超过 2,083 个字符,而且你每次都会覆盖它,所以这还不算太浪费空间。
  • @abluejelly 我倾向于同意不在这里进行消毒 在 where_i_really_want_to_process.php 中进行。因为它使得进行任何错误处理变得更加困难,并且仍然让用户了解情况,同时保持查询字符串几乎不可见
  • 好吧。 “如果可能”意味着完全可以将 $_GET 的内容以明文形式存储一段时间。显然,如果它包含诸如纯文本 SSN 之类的东西(天堂禁止),您将不得不进行一些“清理”。虽然老实说,在那种情况下我会放弃那个第三方,并将它们标记为生物危害物,不能用短于一百英尺的杆子触摸。
  • 问题中已经给出了会话的用法。他需要一个新的解决方案。
【解决方案2】:

如果您必须让用户将数据转发给您,那么“确保”用户永远不会“看到”正在传递的某种形式的数据在物理上是不可能的。他们必须看到某种形式的数据,否则他们无法转身告诉您的服务器数据是什么。

如果您可以加密数据,那将有效地向用户隐藏数据(假设您使用了良好的加密)。但是你缺乏对第三方的控制,所以这可能不可行。

另一种选择是找到您可以信任的第三方来提供有限的数据库访问权限,并让他们直接联系您的服务器,而不是使用客户端作为中间人。在不知道你在做什么的情况下,我不知道这是否可行。

如果您所做的只是试图保护“规范”不为 GET 值添加书签,那么 shove-into-session-then-redirect 技巧就足够了。唯一的其他选择是编写一些 js/ajax/不管它在客户端做什么——但是这对用户来说比在服务器端做的更不透明,并且取决于用户不阻止你的挥手方法。很少有人禁用内部重定向。

我确实支持 Riggs 的方法(将所有 $_GET 推入会话,而不仅仅是您想要的当前密钥)解决有问题的解决方案,但是,因为它让您几乎可以在应用程序的生命周期内忽略此帮​​助脚本.

【讨论】:

  • 根据您的额外想法,实际上听起来 Rigg 的方法是可行的方法。
【解决方案3】:

尝试使用变量的关联数组$_POST

$_POST = $_GET;
$_GET = [];
header('Location: where_i_really_want_to_process.php');

【讨论】:

  • 如果这行得通真的很惊讶,因为重定向会从客户端生成一个新请求,该请求应该为 POST 具有 null。如果是这样,则完全是 PHP 是 PHP,而不是一个好习惯。
  • 这不会使$_POSTwhere_i_really_want_to_process.php 中可用它只会浪费几毫秒,然后再次丢失所有内容
猜你喜欢
  • 2014-02-04
  • 2012-03-30
  • 2011-04-07
  • 1970-01-01
  • 2011-09-04
  • 2016-04-15
  • 2012-04-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多