3

これが最初の質問です。あなたの助けが必要です。

PHPのヘッダーロケーションメソッドを使用して、最初のページから2番目のページにフォームデータを転送します。

2 ページ目では、get を使用してデータを受け入れます。

データが送信された後 (つまり、フォームが送信された後) の 2 ページ目の URL がここにあります。

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

ユーザーが 2 ページ目にいる場合、mysql データベースの ID 番号に従って、2 ページ目のデータが表示されます。

ここでの問題は、ユーザーが 2 ページ目にいて番号を変更すると (たとえば 123 を 78 に)、データベースからの id=78 のデータが表示されることです。これは良くありません。

どうすればそれを止めることができますか?

注意: 投稿もセッションも使用できません。

編集:

最初のページの php コード、2 番目のページに転送します。

// 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 に答える
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 に答える