質問: 以下のような二例が可能かどうか質問させてください。 --- ユーザAがウェブページindex.htmlをサイトhttps://example.comに置きます。 不正なユーザBがindex.htmlをC#などで開発したウェブブラウザで表示し、htmlの内容をライブ的に改変します。ここまでは可能だと思います。以下のリンクで確認ください。 次に不正なユーザBはindex.htmlのクリックボタンを押して不正なGetリクエストをhttps://example.comに送信します。 --- **質問1** この際にMicrosoftのC#のブラウザは、ページが改変されているにも拘わらず、index.htmlのオリジンをhttps://example.comとして扱うのでしょうか? **質問2** そもそも不正なユーザBはGet送信にWebブラウザを使わずとも、index.htmlの内容さえ知れば、後は自作した非ブラウザの通信プログラムで、オリジンを偽装してhttps://example.comに不正なGetリクエストを察知されずに送信できるのでしょうか? 尚、一般にGetリクエス送信にページのオリジンの情報を含めることでブラウザやサイト側がセキュリティをかけていると言うのは私の推測です。検索したのですが結果が得られませんでした。 以上よろしくお願いします。
回答: WebブラウザーのHTTP(S)通信では直前に表示していたページやリンクを含むページののURLをRefererヘッダーに含めて送信します。 > > この際にmicrosoftのC#のブラウザは、ページが改変されているにも拘わらず、index.htmlのオリジンをhttps://example.comとして扱うのでしょうか? > > > `WebBrowser`で使用されているIEコンポーネントでの動作は分かりませんが、一般的にはユーザーがHTMLを改変したとしても元のURLをリファラとして送信するものと思います。 > > そもそも不正なBはGet送信にWebブラウザを使わずとも、index.htmlの内容さえ知れば、後は自作した非ブラウザの通信プログラムで、オリジンを偽装してhttps://example.comに不正なGetリクエストを察知されずに送信できるのでしょうか? > > > HTTP通信の内容は単なるテキストですので、`Referer`やブラウザーの種別を表す`User-Agent`もふくめてすべて自己申告です。ですのでWebブラウザーによるリクエストと、その他のプログラム(`HttpWebRequest`やFiddlerなど)が偽造したリクエストを見分けることは本質的にできません。ですが一般的にWebブラウザー以外のプログラムはJavaScriptの実装が弱いため動的な処理を含めることで排除できる場合があります。具体的にはたとえばWebブラウザー上の操作ログを暗号化してリクエストに含め、サーバー側で検証するサービスなどが提供されています。