質問
このページをご覧くださいThe New York Times:
http://homedelivery.nytimes.com/HDS/learnMorePopUp.do
?mode = common.learnMorePopUp
& productId = NDS
& prodRate = 7.40
prodRate
パラメータを手動で変更すると、ページが更新されたことに驚いた:
- 紹介サブスクリプション率。
- 通常のサブスクリプション率。
自分で試してみてください!今、私はあまりウェブ開発をしていませんが、これはおそらく起こらないはずです。だから私は疑問に思う:
- この動作を引き起こすのはどのような実装ですか?
- このような機密性の高いパラメーターをエンドユーザーから隠すために、どのようにページを変更しますか
解決
あなたが質問を言い換えたいと思うかもしれません、私が思いつくことができる唯一の答えがあまりにも明快ではないので:
Q:どのような実装がこの動作を引き起こしますか?
A:ユーザー入力が内部の信頼できる動作を制御できるもの。 「誰かがこれを行う理由」を求めている場合、私は通常それを誤解だと思っています。コード作成者は一般に、ユーザーが(a)値を制御したり、(b)値が存在することを発見したりできることを認識していません。ほとんどの場合、これはリダイレクトとして実装されています。ボタンをクリックすると、サーバーが金額を決定し、値を保持する新しいページにブラウザをリダイレクトします
Q:このような機密性の高いパラメーターをエンドユーザーから隠すために、ページをどのように変更しますか?
A:エンドユーザーが編集可能な方法で値を保存しないでください。サーバー上で使用可能なストレージ(サーブレットエンジンなど)がある場合は、セッションコンテキストに保存します。適切なセッションメカニズムがない場合は、署名済みまたはHMACされたCookieに保存できます。
他のヒント
これらはおそらく、表示のためにクエリ文字列から値を読み取っているだけです。実際の注文処理がその値に基づいているのではなく、製品IDを使用したルックアップからではないことを非常に疑います(または、むしろ望みます)。
まあ、実際に注文しようとしたことがありますか?バックエンドで入力を検証する場合があります。
他のオプションについては、情報を投稿するか、Cookieに情報を入れることを検討できたでしょう。どちらもまったく馬鹿な証拠ではありません。投稿を含む新しいウィンドウを取得することはできず、ユーザーはCookieをオフにすることができます。
そのページから注文することはできないため、ここにセキュリティホールはありません。ええ、それは安っぽいですが、実際の注文フローが非常に不十分に構築された場合、私ははるかに心配になるでしょう。レートを1か所で簡単に更新し、値を渡すだけなので、どのように発生したかを確認できます。
ほぼ同じことを行う評価ページがあります。これらは実際の購入フローに接続されていないため、パラメーターは問題ありません。クライアントがURLを編集することで混乱する場合、実際の注文フローはすべてデータベース主導であり、ユーザーの編集は決して信頼されません。
このようなあらゆる種類の悪い習慣が見つかりました。 Webサイトがクエリ文字列でSQLクエリ全体を渡すと、実行されます。また、クエリ文字列で価格を渡すオンラインショップを見つけたことも覚えています。私は1つを負の値に変更しました、そして確かに、チェックアウト時に価格はマイナスでした!しかし、私はこれ以上は進めませんでした-技術的には詐欺であり、リスクを負う価値はありません。