0

我正在创建一个系统,该系统通过在页面之间传递令牌来验证请求的有效性来保护它。令牌将在登录页面上生成(因为它只需要生成一次)然后传递到主页。但是,有一个中间 PHP 脚本正在运行以使用户登录,我不确定如何获取发布的令牌并将其传递到主页。

简而言之,我需要将令牌从登录页面发布到中间脚本,然后从脚本发布到主页,我不知道该怎么做。

4

5 回答 5

0

将数据存储在 cookie/会话中:

session_start();

$_SESSION['token'] = 'yourTokenHere'

请参阅PHP 会话

于 2012-09-24T00:48:25.433 回答
0

进一步考虑,看起来我让事情变得比他们需要的复杂得多。谢谢大家的帮助,但解决方案似乎是我应该更聪明一点。

于 2012-09-24T01:32:33.587 回答
0

如果所有 3 个页面都在同一主机上,请使用cookiesession

于 2012-09-24T00:44:23.980 回答
0

您可以使用客户端 cookie:

<?php
setcookie("token", $myToken);
?>

这种方法最大的缺点是它绝对要求用户在他们的浏览器上启用 cookie。在高度安全的情况下,用户可能没有启用 cookie,因此这种方法对他们不起作用。

使用$_SESSION全局变量:

<?php
$_SESSION['token'] = $myToken;
?>

作为以前的变体,它需要启用 cookie。

$_GET参数添加到 URI 字符串:

http://example.com?token=f4FArqk53Gwr4fESC73FedG48Trd3YEj

这种方法最大的缺点是你的URI字符串看起来很复杂。

如果用户手动修改,状态信息也会丢失URI

或者传递隐藏表单字段中的所有内容:

不幸的是,它要求您在每个页面上提交一个表单。

你可以用jQuery.


这里有一些例子。

于 2012-09-24T00:52:22.497 回答
0

我很久以前写过这个:

function postheader($url, $server, $cookies, $daten)
{   
    $temp=array();
    $out = "POST ".$url." HTTP/1.1\r\n";
    $out .= "Host: ".$server."\r\n";
    if(count($cookies)>0)
    {
        $out .= "Cookie: ";
        foreach($cookies as $name=>$value)
        {
            $temp[] = $name."=".$value;
        }
        $out .= implode("; ",$temp);
        $out .= "\r\n";
    }
    $out .= "User-Agent: Mozilla/4.0\r\n";
    $out .= "Content-type: application/x-www-form-urlencoded\r\n";
    $temp=array();
    foreach($daten as $key=>$data)
    {
        $temp[] = $key."=".urlencode($data);
    }
    $temp=implode("&",$temp);
    $out .= "Content-Length: ".strlen($temp)."\r\n";
    $out .= "\r\n";
    $out .= $temp."\r\n";

    return $out;
}


$fp = fsockopen($server, 80, $errno, $errstr, 30);
if (!$fp)
   die( "$errstr ($errno)<br />\n");

$out=postheader($url, $server, $cookies, $daten);
//echo $out;

fwrite($fp, $out);
while (!feof($fp))
{
    $string.= fgets($fp, 128);
}
fclose($fp);

$daten 应该是一个一维关联数组,其中包含您要通过 post 请求发送的数据。对于 cookie,只需添加一个空数组。

$server 是主机地址,$url 只是服务器上的地址,例如

$server="stackoverflow.com";
$url="/post.php";

$string 将包含整个响应,包括标题。如果您不想要它们,请从第一个 "\r\n\r\n" 出现中创建一个子字符串。

于 2012-09-24T00:54:31.123 回答