3

这是第一个问题,我需要你的帮助。

我使用 php 中的标题位置方法将表单数据从第一页传输到第二页。

在第二页上,我使用 get 接受数据。

现在这里是第二页的url,在数据发送之后(即提交表单)

http://mydomain.com/site1/form1_conf.php?id=123

当用户在第二页时,第二页上的数据将根据 mysql 数据库中的 id 号显示。

现在的问题是,当用户在第二页上并且他更改数字(例如 123 到说 78)时,显示来自数据库的 id=78 的数据,这是不好的。

我怎么能阻止它?

请注意:我不能使用帖子,也不能使用会话。

编辑:

第一页上的php代码,转移到第二页:

// after all validations are okay
$insert = //insert into database
$result = mysql_query($insert);
if($result)
{
echo("<br>Input data is succeed");
$lastInsertedId =  mysql_insert_id();
header('Location:form1_conf.php?id='.$lastInsertedId); //THIS IS THE IMPORTANT LINE
}
else
{
$message = "The data cannot be inserted.";
$message .= "<br />" . mysql_error();
}
4

4 回答 4

5

您的问题不在于 URL:对于高级用户而言,更改 cookie 或 POST 变量与为普通用户编辑 GET 变量一样简单。您将需要某种方式将请求“签名”为有效。

最容易做到这一点的是使用“预共享密钥”,您可以将其与单向哈希一起使用来验证请求。

重定向器:

$newURL = '/newpage?id='.$id.'&hash='.sha1('mypresharedkey'.$id);
header('HTTP/1.1 303 See other');
header('Location: '.$newURL);
die;

另一页:

$idToShow = $_GET['id'];
$hash = sha1('mypresharedkey'.$id);
if($hash != $_GET['hash'])
  die("Tssss, don't play with the address bar!");
else
  RenderThePage();

这可确保最终用户只能访问提交允许他们访问的页面。


对于您的特定代码:

...all prior code
$lastInsertedId = mysql_insert_id();
$timestamp = time();
header('Location:form1_conf.php?'.http_build_query([
      'id' => $lastInsertedId,
      'time' => $timestamp,
      'hash' => sha1('some-generated-key'.$timestamp.$lastInsertedId)
]);

在另一页中,如果需要,包括定时炸弹(否则只需将其注释掉):

$id = $_GET['id'];
$time = $_GET['time'];
if($_GET['hash'] != sha1('some-generated-key'.$time.$id))
  die('URL was tampered with');
if(time() - $time > 300)
  die('URL was only valid for 5 minutes');
于 2013-07-30T14:52:56.907 回答
1

您需要跟踪用户和他们在数据库中的 ID,以确保他们没有更改号码。因此,当您通过 获取信息时,GET请确保它是合法的。

用户可以更改 id 甚至尝试通过 url 直接进入该页面。因此,您需要某种服务器端检查来验证它是否正常。

于 2013-07-30T14:52:24.897 回答
1

如果您没有直接传递 ID 号,而是以某种方式对其进行了加密,那么您可能会使这种“作弊”复杂化一点。

假设您定义了一种盐:

define(SALT, 'long weird salt with special characters etc.');

这是您想要的第一部分:

$lastInsertedId = mysql_insert_id();

$querytag = base64_encode($lastInsertedId); // just to make it less readable
$checksum = md5($querytag . SALT); // and make a hash

header('Location:form1_conf.php?id=' . $querytag . '&checksum=' . $checksum); 

在 form1_conf.php 的开头,你把这个:

$encodedId = $_GET['id'];
$oldChecksum = $_GET['checksum'];

$newChecksum = md5($encodedId . SALT);

$id = base64_decode($encodedId);

if($newChecksum != $oldChecksum) {
    die('You Are Cheating!');
}

... do something with the $id ...

关键是,由于您将 SALT 添加到哈希中,因此某些用户不能简单地对更改的 ID 使用 md5,因为他缺少您使用的 SALT。

如果每次的盐都不一样就更好了。

于 2013-07-30T14:57:42.790 回答
0

你永远不应该相信 url,因为总有办法操纵数据。

因此,您应该在检索数据后进行验证。如果结果不适合您:例如,ID = 1 的登录用户从 userid = 3 请求设置页面,则不会显示结果。

<?php
    $userID = $_GET['id'];
    if($userID != $expectedResult)
    {
        //show errormessage, redirect or show the page with the users data
    }

?>
于 2013-07-30T14:52:13.493 回答