1

私は最近この質問をしました。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'*
    }
}

ただし、これは各ページの「ヘッダー」であるため、一般的なものである必要があります。たとえば、(別のページまたはフォームから)送信された投稿または取得データは、リダイレクトされたページに送信する必要があります。

GetはURLに含めることができるので簡単ですが、Postで問題が発生しています。

投稿データを次のページに送信するためにcURLから始めましたが、実際にはそのページに移動していないことに気付きました

$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つのページ間でデータを送信していますが、必ずしもセッションに関する情報ではありません。

2番目に関しては、別のセッション変数を設定して、投稿データがセッションに移動されたかどうかを次のページに通知します。ただし、その変数をリセットする必要があるたびに、物事が複雑で乱雑になります。

例: フォームデータを検証ページに送信する登録ページがあります。これらの両方に、Cookieが有効になっているかどうかを確認するためのヘッダーがあります。

投稿データは検証ページに送信されますが、問題が発生した場合、データを検証ページに投稿して戻すことができません(問題の内容をユーザーに通知します)。登録エラーを含むセッション変数を設定する必要があります。 。そして毎回、登録エラー変数の設定を解除する必要があります。

今のところ、検証ページにCookieは必要ないと思いますが、抜け穴は必要なく、後で何を追加するかわかりません。

問題に戻る

  1. 各ページでCookieが有効になっているかどうかを確認する必要があります。
  2. 現在のアプリケーションが最も効率的な方法(リダイレクト)であるかどうかはわかりません。それは確かに多くの問題を引き起こしました
  3. 誰かがリダイレクトせずにCookieをチェックする方法を教えてくれるなら(そして他のものと競合しない)、それは解決策と同じくらい良いです
  4. JavaScriptや非表示のフォームに依存したくありません; 体験をコントロールしたい
  5. 2ページ間で効率的にデータを送信する必要があります。ページごとに変数を設定および設定解除する必要があるため、特定のアプリケーションのセッションは好きではありません。

それは大きな仕事だと思いますが、誰か助けていただければ幸いです。

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ページのPOSTデータにXSSの脆弱性がありechoますが、セキュリティで保護するのはあなたに任せます。

于 2012-04-05T19:13:12.267 に答える
0

これが役立つかどうかはわかりませんが、ページ数を制限してみてください。私が通常行うことは、1つのphpページでフォームと検証を行うことです。ユーザーが最初に何かを送信したかどうかを確認します。送信した場合は、それを確認してエラーを表示します。そうでない場合は、フォームを表示します。

于 2012-04-05T19:02:44.390 に答える