试图在PHP页面之间发送数据;发布/ cURL无法正常工作,会话变得混乱

时间:2012-04-05 18:23:41

标签: php session post curl

我最近问了这个问题Posting data with curl - actually refreshing to the next page,但我很快意识到解决方案并不是很好......

所以我在几个地方的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'*
    }
}

但是,由于这是每个页面上的“标题”,因此它必须是通用的。例如,发送给它的任何发布或获取数据(来自其他页面或表单)都应发送到重定向页面。

获取很容易,因为我可以将其包含在网址中,但我一直遇到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. 效率不高 - 我在两页之间发送数据,不一定是关于会话的信息。
  3. 关于数字2,我设置了另一个会话变量,如果Post数据已移动到Session,则告诉以下页面。但是,每次我必须重置该变量时,它只会使事情变得复杂和不整洁。

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

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

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

    回到问题

    1. 我需要检查每页是否启用了Cookie。
    2. 我不知道 我目前的应用是最有效的方式(重定向);它的 肯定会引起很多问题
    3. 如果有人能告诉我怎么做 检查cookie而不重定向(并且不与...冲突 其他任何东西),那就像一个     溶液
    4. 我不想依赖javascript或隐藏的表单;我想控制体验
    5. 我需要在两页之间发送数据 有效率的。我不喜欢某些应用程序的会话 需要设置和取消设置     每页的变量。
    6. 我知道这是一项艰巨的任务,但如果有人能提供帮助,我们将非常感激!

2 个答案:

答案 0 :(得分: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漏洞echo POST数据,但我会将此保留给您保护。

答案 1 :(得分:0)

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