1

我最近问了这个问题Posting data with curl - 实际上刷新到下一页,但我很快意识到解决方案并不是很好......

所以我在几个地方的 PHP 页面之间传递数据。这是我目前的问题:

我依赖 cookie,因此我会在每个页面的顶部检查是否启用了 cookie:

session_start();
if (!isset($_COOKIE['PHPSESSID'])) {
    if ($_GET['rd'] == '1') {
        header('Location: *redirect url*');
    } else {
        *refresh the page, setting 'rd' to '1'*
    }
}

但是,由于这是每个页面上的“标题”,它需要是通用的。例如,任何发送给它的帖子或获取数据(从另一个页面或表单)都应该发送到重定向页面。

获取很容易,因为我可以将它包含在 url 中,但是我在使用 Post 时遇到了问题。

我从 cURL 开始将 Post 数据发送到下一页,但我意识到它实际上并没有转到该页面

$ch = curl_init($some_url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, 'myvar=something');
curl_exec($ch);
curl_close($ch);$ch = curl_init($some_url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, 'myvar=something');
curl_exec($ch);
curl_close($ch);

cURL 之后不会加载 $url ;它返回它

所以有人建议我使用 Sessions,我很快意识到这不是一个很好的解决方案;

  1. 重定向时,如果我把Post数据设置为Session变量(存储数据),那么每个使用Post数据的页面都需要检查数据是在Post还是Session中。
  2. 它效率不高 - 我在两个页面之间发送数据,不一定是有关会话的信息。

关于数字 2,我设置了另一个会话变量来告诉下一页是否已将 Post 数据移动到 Session。但是,每次我必须重置该变量时,它只会让事情变得复杂和不整洁。

示例: 我有一个将表单数据发送到验证页面的注册页面。这两个都有标题来检查是否启用了cookie。

发布数据被发送到验证页面,如果出现问题,我无法将数据发布回验证页面(告诉用户问题出在哪里),我必须设置一个带有注册错误的会话变量. 每次,我都必须取消设置注册错误变量。

现在我认为验证页面上不需要cookie,但我不想要任何漏洞,我不知道以后会添加什么。

回到问题

  1. 我需要检查是否在每个页面上启用了 cookie。
  2. 我不知道我当前的应用程序是否是最有效的方式(重定向);这肯定引起了很多问题
  3. 如果有人能告诉我如何在不重定向的情况下检查 cookie(并且不与其他任何内容冲突),那就是一个解决方案
  4. 我不想依赖 javascript 或隐藏表单;我想控制体验
  5. 我需要有效地在两个页面之间发送数据。不喜欢某些应用程序的会话,因为我需要设置和取消设置每个页面的变量。

我知道这是一项艰巨的任务,但如果有人能提供帮助,将不胜感激!

4

2 回答 2

1

如果所有中间页面都在验证表单数据,则将其废弃;只需在同一个 PHP 脚本中执行此操作。最简单的是,您可以拥有:

<?php
    $yourkey = 'goeshere';
    if (!isset($_COOKIE[$yourkey])) {
        setcookie($yourkey, $value, $expires);
    }

    if (isset($_POST['submit'])) {
        $errors = array();
        // do validation here
        // iterate over your fields and add any errors to $errors array
        if (empty($errors)) {
            // redirect if there are no errors, if you really need to
            header('Location: success.php');
            exit;
        }
    }
?>
<html>
  <body>
    <form method="post" action="">
      <label for="name">Your name:</label>
      <input type="text" name="name" value="<?php echo isset($_POST['name']) ? $_POST['name'] : ''; ?>" id="name" />
      <input type="submit" name="submit" value="Submit" />
    </form>
  </body>
</html>

在您的 HTML 页面中有一个 XSS 漏洞echoPOST 数据,但我将把它留给您来确保安全。

于 2012-04-05T19:13:12.267 回答
0

我不确定这是否有帮助,但也许您可以尝试限制页面数量?我通常做的是将表单和验证放在一个 php 页面上。您检查用户是否在开始时发送了某些内容,如果发送了,请检查并显示任何错误。如果没有,请出示表格。

于 2012-04-05T19:02:44.390 回答