ページ間でパラメーターを渡す 2 つの方法を知っています。
- POST を使用して
<input type="hidden">
- 使用して
$_SESSION["variable_name"]
2 番目の方法の方が簡単だと思いますが、最初の方法と同じくらい安全かどうかは疑問です。なぜなら、私が目にするほとんどのチュートリアルでは、最初の方法を使用しているからです。
2 番目の方法よりも 1 番目の方法を優先する重要な理由はありますか?
違いを理解するために、各ソリューションがどのように機能するか、およびそれらのセキュリティ リスクについて詳しく見ていきましょう。この例では、ユーザーのページ ビューの数を保存します。
セッションを開始し、カウンターをインクリメントして$_SESSION
配列に保存します。
<?php
session_start();
if(!isset($_SESSION["pageviews"]))
{
$_SESSION["pageviews"] = 0;
}
$_SESSION["pageviews"]++;
?>
ユーザーが初めてこのページにアクセスすると、PHP は次のようなランダムなセッション ID を生成し、ブラウザーにこの ID を Cookie に保存するように要求します。
fh4giqncq25ntgs7gjunvj6i33
サーバー上では、セッション ID に属するpageviews
値を持つ変数があることを保存して記憶します。1
fh4giqncq25ntgs7gjunvj6i33
次にユーザーがページにアクセスすると、ブラウザーは以前のセッション 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 でブラウザーに送信されます。