7

ページ間でパラメーターを渡す 2 つの方法を知っています。

  1. POST を使用して<input type="hidden">
  2. 使用して$_SESSION["variable_name"]

2 番目の方法の方が簡単だと思いますが、最初の方法と同じくらい安全かどうかは疑問です。なぜなら、私が目にするほとんどのチュートリアルでは、最初の方法を使用しているからです。

2 番目の方法よりも 1 番目の方法を優先する重要な理由はありますか?

4

1 に答える 1

35

違いを理解するために、各ソリューションがどのように機能するか、およびそれらのセキュリティ リスクについて詳しく見ていきましょう。この例では、ユーザーのページ ビューの数を保存します。

$_SESSION

セッションを開始し、カウンターをインクリメントして$_SESSION配列に保存します。

<?php
session_start();
if(!isset($_SESSION["pageviews"]))
{
    $_SESSION["pageviews"] = 0;
}
$_SESSION["pageviews"]++;
?>

ユーザーが初めてこのページにアクセスすると、PHP は次のようなランダムなセッション ID を生成し、ブラウザーにこの ID を Cookie に保存するように要求します。

fh4giqncq25ntgs7gjunvj6i33

サーバー上では、セッション ID に属するpageviews値を持つ変数があることを保存して記憶します。1fh4giqncq25ntgs7gjunvj6i33

次にユーザーがページにアクセスすると、ブラウザーは以前のセッション ID を要求と共に送信します (Cookie の有効期限が切れていないか、削除されていない場合)。次に、PHP はこの ID を認識し、$_SESSION配列にを入力してpageviews = 1インクリメントします。pageviews = 2

セキュリティに関しては、次の点を考慮してください。

ユーザーは保存されたデータを読み取ることができますか? いいえ- クライアントが確認できるのは、Cookie 内のランダム セッション ID だけです。データ自体はサーバーに保存されます。

ユーザーは保存されたデータを変更または操作できますか? 繰り返しますが、いいえ- ブラウザーでセッション ID が変更された場合、PHP はブラウザーを保存されたデータに関連付けることができなくなります。この最悪のシナリオでは、ユーザーは から始まる新しいセッションを取得しpageviews = 1ます。

セッションの主なセキュリティ リスクはセッション ハイジャックです。これは、攻撃者が何らかの方法で他のユーザーのブラウザからセッション ID を取得し、それをサーバーに提示して、他のユーザーになりすますことです。この例では、ページ ビュー カウントのみを格納しているため、あまり意味がありません。ただし、ほとんどのサイトではセッションを使用して、どのユーザーがどのブラウザーからログオンしているかを追跡しています。そのシナリオでは、他の誰かのセッションを盗むことは、そのアカウントへのアクセスを取得することを意味します.

隠しフィールド

この場合、隠しフィールドを持つフォームがあります。

<form action="..." method="post">
    <input type="hidden" name="pageviews" value="<?php print($pageviews); ?>" />
    ...
</form>

pageviewsサーバーでは、変数を取得し$_POSTてインクリメントします。

<?php
$pageviews = @$_POST["pageviews"];
$pageviews++;
?>

したがって、サーバーに保存する代わりに、基本的にデータをクライアントに送信し、後続のリクエストでデータが返されることを期待します。POSTリクエストでのみ機能するという事実とは別に、このソリューションのセキュリティ関連の欠点を見てみましょう。

ユーザーは保存されたデータを読み取ることができますか? はい。HTML コードでブラウザに直接送信されます。

ユーザーは保存されたデータを変更または操作できますか? はい。ユーザーがブラウザーで開発者ツールを開き、隠し値を好きな値に変更することを妨げるものは何もありません。フォームを送信すると、サーバーは変更されたデータを取得します。

問題<input type="hidden">、クライアントを信頼できないことです。そのため、すべてのリクエストで取得するデータを検証する必要があります。複数ページのフォームに記入する場合など、場合によってはこれを行うのが合理的かもしれませんが、多くの場合、セッションを使用するとより適切に解決できます。

概要

セッションデータはサーバーに保存され、クライアントによって改ざんされることがないため、$_SESSION一般に、を使用するよりもデータを永続化する方が安全です。<input type="hidden">ランダムなセッション ID のみが、サーバー上のデータを特定のブラウザーに関連付ける Cookie でブラウザーに送信されます。

于 2013-09-26T18:42:48.817 に答える