0

そのため、ページからページへと変数を渡すときに、変数をフォーム アクションに渡したい場合は、単純にそれを<input type="hidden">要素に格納します。これは一般的にうまく機能しますが、誰かが簡単に HTML マークアップに入り、単にhiddenテキストを入力するように変更できるため、渡されたものを簡単に編集できることに気付きました (自分のプロファイルを編集していて、私が非表示の入力フィールドの ProfileID を別のユーザーのものに変更した)

この問題を解決するためのベスト プラクティスがあるかどうか疑問に思っていましたか? 何人かの同僚と話をしたところ、彼らは、フォームを送信するときにサーバーにチェックを入れて、間違った情報を渡していないことを確認するように言いました. それについて最善の方法はありますか、それとも他の方法はありますか?

4

1 に答える 1

3

セキュリティに関しては、正しく指摘したように、クライアントからの情報を信頼することはできません。これは、そのようなページが呼び出されたときにサーバー側に保存する必要があることを意味します。

一般的な方法は、各クライアントに Cookie でセッション ID を与えることです。サーバー側では、すべての機密情報をそのセッション ID に関連付けることができます。セッション ID はランダムにする必要があります。シーケンシャルであれば、その値を変更して、他の誰かのセッションをランダムに乗っ取ることができるからです。

セッション識別子に関する情報を保存するには、複数の方法があります。PHP で最も柔軟で、おそらく実装が最も簡単なのは、組み込みのセッション サポートを使用することです。PHP がセッション ID を処理し、シリアル化可能なオブジェクトを$_SESSIONスーパーグローバルに格納できるようにします。セッションデータはサーバーの一時フォルダーに保存されることが多く、共有サーバーの場合、そのサーバー上の他のWebサイトが理論的にスヌープしてセッションデータを表示または操作する可能性があるため、これは問題のないソリューションです. もちろん、あなたがやっていることの影響が非常に小さい場合、誰かがあなたをいじるために同じサーバーをレンタルすることはまずありません. それでも、たとえば、OAuth プロバイダーは、OAuth トークンを$_SESSIONパブリック環境のストレージに保存しないことを推奨しています。

<?php
session_start();
// place anything you need to save between pages in $_SESSION
$_SESSION["foo"] = array("bar", "baz");
// until you unset $_SESSION["foo"], it will be available in every page that called
// session_start().
?>

session_destroyユーザーがログアウトするときに呼び出して、セッション データが必要以上に長く存在しないようにすることをお勧めします。

一方、MySQL などのデータベースに情報を保存することもできます。これは、個別のデータベース ユーザーまたは各サーバー ユーザー用の個別のデータベースを持たないホストから逃げる必要があるため、セキュリティ面で優れています。セッション情報。ただし、保存したいものをすべて保存するにはテーブル構造が必要なため、これはそれほど柔軟ではありません。

于 2013-11-01T18:48:42.850 に答える