C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Windows10のIE11において

[トピック内 14 記事 (1 - 14 表示)]  << 0 >>

■83764 / inTopicNo.1)  Windows10のIE11において
  
□投稿者/ アタ (1回)-(2017/04/07(Fri) 13:37:46)

分類:[ASP.NET (VB)] 

VS2010 asp.net4.0 VB
クライアント Win10 64bit IE11

Server.Transferでパラメータに日本語を使用しページ遷移すると、
Request.UrlReferrerがNothingになって取得できません。

XXXXX.aspx?P1=日本語(実際は%XX%)

直接URLを指定して呼出を防止するために
上記の処理を入れておりますが、
取得出来ないため、直接呼出と判断されてしまいます。

クライアント Win7 64bit IE11では問題ありません。

何か対応策(代案)はないでしょうか?
宜しくお願い致します。
引用返信 編集キー/
■83766 / inTopicNo.2)  Re[1]: Windows10のIE11において
□投稿者/ WebSurfer (1213回)-(2017/04/07(Fri) 14:54:14)
No83764 (アタ さん) に返信

Server.Transfer はサーバー側だけの話なのでブラウザの違いは関係ないと思うのですが?

以下の記事の図 16.2 を見てください。

第16回 ASP.NETにおけるページの遷移 (1/4)
http://www.atmarkit.co.jp/ait/articles/0304/05/news003.html

> Server.Transferでパラメータに日本語を使用しページ遷移すると、
> Request.UrlReferrerがNothingになって取得できません。

というところ、具体的にどういうコードになっているのでしょうか?
引用返信 編集キー/
■83767 / inTopicNo.3)  Re[2]: Windows10のIE11において
□投稿者/ アタ (2回)-(2017/04/07(Fri) 15:47:20)
> というところ、具体的にどういうコードになっているのでしょうか?

1.aspxから2.aspxを日本語パラメータを付与して呼び出す

Me.context.Server.Transfer("2.aspx?P1=%XXX")


Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)

If Me.Context.Request.UrlReferrer Is Nothing Then
session.Clear()
End If

End Sub

ページ遷移時は問題ないが、2回以降のポストバック時に
Request.UrlReferrerが消えてしまいます。
すみません説明の仕方が正しいのかも自信がありませんが。
引用返信 編集キー/
■83768 / inTopicNo.4)  Re[3]: Windows10のIE11において
□投稿者/ アタ (3回)-(2017/04/07(Fri) 17:36:04)
補足します。

1.aspxから2.aspxへServer.Transferでページ遷移した場合、
URL欄は「1.aspx」のままとなります。
遷移時のRequest.UrlReferrerは「1.aspx」

遷移後の2.aspxでPostbackを行うと、
URL欄は「2.aspx?P1=%XXX」に変わりますが
Request.UrlReferrerは「1.aspx」

この状態で2度目のポストバックを行うと、
Windows7 IE11 だとRequest.UrlReferrer=「2.aspx?P1=%XXX」を取得しますが、
Windows10 IE11 だとRequest.UrlReferrer= Nothingとなってしまいます。

上記が再現されるのはURLに日本語を含む場合となります。
引用返信 編集キー/
■83769 / inTopicNo.5)  Re[3]: Windows10のIE11において
□投稿者/ WebSurfer (1214回)-(2017/04/07(Fri) 17:42:25)
No83767 (アタ さん) に返信

断片的なコードだけではなくて問題を再現できる必要最低限のコードをアップして
再現手順を書いていただけませんか?

引用返信 編集キー/
■83770 / inTopicNo.6)  Re[4]: Windows10のIE11において
□投稿者/ アタ (5回)-(2017/04/07(Fri) 18:01:10)
No83769 (WebSurfer さん) に返信
> ■No83767 (アタ さん) に返信
>
> 断片的なコードだけではなくて問題を再現できる必要最低限のコードをアップして
> 再現手順を書いていただけませんか?
>

申し訳ありません。
当方知識不足で必要最低限のコードがどの程度のものを示すのかわかりません。
下記の説明でも意味不明でしたら諦めます。

準備
ページAにページBへServer.Transferで遷移するボタンを配置(パラメータに日本語を付与)
ページBにPostBackを行うボタンを配置
ページBのPage_LoadでRequest.UrlReferrerを取得する
再現手順
(デバックでRequest.UrlReferrer値を監視)
ページAからページB遷移する
ページBでボタンを押す。
ページBでボタンを押す。
Windows7では何度押してもRequest.UrlReferrer値はページBの値を返しますが、
Windows10ではNothingになってしまいます。
引用返信 編集キー/
■83771 / inTopicNo.7)  Re[4]: Windows10のIE11において
□投稿者/ PANG2 (170回)-(2017/04/07(Fri) 18:10:52)
2017/04/07(Fri) 18:14:44 編集(投稿者)

リクエストヘッダ (Referrer)を観察してみるとか。

ブラウザ側のトレース
https://blogs.msdn.microsoft.com/osamum/2011/08/14/f12-ie9-http/

サーバー側のトレース
http://www.atmarkit.co.jp/fdotnet/dotnettips/040trace/trace.html


> 何か対応策(代案)はないでしょうか?

ポストバック時はUrlReferrerをチェックしないとか。
引用返信 編集キー/
■83772 / inTopicNo.8)  Re[5]: Windows10のIE11において
□投稿者/ WebSurfer (1215回)-(2017/04/07(Fri) 19:36:40)
No83770 (アタ さん) に返信

以下のコードで Windows 10 Pro. 64-bit の IE11 で試してみましたが、当方でも問題を
再現できました。Windows 10 + IE11 のバグかもしれませんね。

ページ A
-------- 

<%@ Page Language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">
    protected void Button1_Click(object sender, EventArgs e)
    {
        Server.Transfer("0206-ServerTransferB.aspx?P1=abc");
    }
</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <h1>Page A</h1>
    <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
    </form>
</body>
</html>


ページ B
--------

<%@ Page Language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

    
    protected void Page_Load(object sender, EventArgs e)
    {
        Label1.Text = Request.UrlReferrer.ToString();
    }
</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <h1>Page B</h1>
    <asp:Button ID="Button1" runat="server" Text="Button" />
    <br />
    <asp:Label ID="Label1" runat="server"></asp:Label>
    </form>
</body>
</html>

質問者さんの言われる通り、ページ A のボタンクリックでServer.Transfer によりページ B 
に遷移後、ページ B のボタンクリックでポストバックすると、2 回目ではリファラが送られ
ません。

以下の Fiddler でのキャプチャ画像の #4 を見てください。

http://surferonwww.info/BlogEngine/image.axd?picture=2017%2f4%2freferer.jpg

#6 以降は Chrome によるもので、問題なくリファラは送信されています。

ちなみに、クエリ文字列の「日本語」を「abc」に変えると Windows 10 + IE11 でも問題は起
こりません(リファラは送信されます)

やっぱり Windows 10 + IE11 のバグかなぁという感じです。

そうだとすると、IE11 で対応してもらうまでは何ともならないので、クエリ文字列に日本語を
使わないとか、リファラに頼らないなどの回避策を取るほか手はなさそうな気がします。

引用返信 編集キー/
■83773 / inTopicNo.9)  Re[5]: Windows10のIE11において
□投稿者/ WebSurfer (1216回)-(2017/04/07(Fri) 19:40:36)
No83770 (アタ さん) に返信

上にアップしたページ A のコードで、

protected void Button1_Click(object sender, EventArgs e)
{
Server.Transfer("0206-ServerTransferB.aspx?P1=abc");
}

となってますが、問題があるのは P1=日本語 とした場合です。

P1=abc なら問題ないです。
引用返信 編集キー/
■83774 / inTopicNo.10)  Re[6]: Windows10のIE11において
□投稿者/ アタ (6回)-(2017/04/07(Fri) 23:06:26)
PANG2さん
ポストバック時にチェックしないことも考えたのですが、
そのページから次のページに遷移する際に次のページで同様の問題が起こってしまい困ってました。

WebSurferさん
当方の環境の問題ではないことがわかり良かったです。
ブラウザをIE11に制限しているので、アップデートなどで改善されるのを待ち、
しばらくUrlReferrerによるチェックは外すように致します。
検証頂きありがとうございました。
引用返信 編集キー/
■83775 / inTopicNo.11)  Re[7]: Windows10のIE11において
□投稿者/ WebSurfer (1217回)-(2017/04/07(Fri) 23:29:12)
No83774 (アタ さん) に返信

このスレッドの件に関し他に質問がなければ「解決済み」マークを付けてクローズしてください。
引用返信 編集キー/
■83776 / inTopicNo.12)  Re[8]: Windows10のIE11において
□投稿者/ 佐久間 (1回)-(2017/04/08(Sat) 12:24:36)
No83775 (WebSurfer さん) に返信
命令?
引用返信 編集キー/
■83778 / inTopicNo.13)  Re[5]: Windows10のIE11において
□投稿者/ WebSurfer (1218回)-(2017/04/08(Sat) 13:30:20)
No83770 (アタ さん) に返信

追加情報です。

そもそもの原因は Windows 10 の IE11 ではなく ASP.NET 4(3.5 以前も?・・・未確認
です)にあるようです。

また、Server.Transfer は関係ないです。ちなみに、Response.Redirect にしても変わり
ません。つまりページ A からの遷移は関係ないです。

問題は、ASP.NET が応答の from 要素に設定する action 属性にあるようです。

例えば、IE11 のアドレスバーに直接以下の URL(クエリ文字列の "日本語" は URL エン
コードしてます)を入力して直接ページ B を GET 要求したとします。

http://aspnet4site/0206-ServerTransferB.aspx?P1=%e6%97%a5%e6%9c%ac%e8%aa%9e

そうすると、ASP.NET により応答の form 要素の action 属性に設定されるのは以下のよ
うになります。

action="./0206-ServerTransferB.aspx?P1=%u65e5%u672c%u8a9e"

つまり、要求 URL のクエリ文字列の "日本語" は UTF-8 のパーセントエンコーディング
なのに、応答の form 要素の action 属性に設定されるのは Unicode のパーセントエン
コーディングになってしまいます。そこに問題があるようです。

具体的には、IE11 の場合以下のような動きになります。Edge も同様で 2 回目のポスト
バックではリファラを送りません。

(1) 最初の GET(以下は、要求ヘッダのリファラと、応答の form 要素の action 属性)
・初回要求なので当然リファラは無し
・action="./0206-ServerTransferB.aspx?P1=%u65e5%u672c%u8a9e"

(2) 1 回目のポストバック
・Referer: http://aspnet4site/0206-ServerTransferB.aspx?P1=%e6%97%a5%e6%9c%ac%e8%aa%9e
・action="./0206-ServerTransferB.aspx?P1=%u65e5%u672c%u8a9e"

(3) 2 回目のポストバック
・リファラを送信しない
・action="./0206-ServerTransferB.aspx?P1=%u65e5%u672c%u8a9e"

ちなみに、Chrome バージョン 57.0.2987.133 (64-bit) では 2 回目以降(上の (3) 以降)
でも以下のリファラが送信されます。

Referer: http://aspnet4site/0206-ServerTransferB.aspx?P1=%u65e5%u672c%u8a9e

質問者さんによると、

> クライアント Win7 64bit IE11では問題ありません。

とのことですが、たぶん Chrome と同様なのではないかと想像してます。

Windows 10 の IE11 で何故上の (3) でリファラが送信されないのかは不明ですが、どうも
バグではなくてセキュリティ対策のような気がします。

その想像が当たっているとすると、将来的に変わることはなさそうなので、

> 何か対応策(代案)はないでしょうか?

に対しては、

(1) クエリ文字列には ASCII 文字のみ使用する、or

(2) リファラに頼るのは止めて何か別の手段を考える、or

(3) ASP.NET 4.5 にアップグレードする(form 要素の action 属性に設定される URL の
  クエリ文字列は P1=%e6%97%a5%e6%9c%ac%e8%aa%9e になり、2 回目のポストバック以
  降もリファラは送信されることを自分の環境で確認しました)

・・・ということが考えられます。

引用返信 編集キー/
■83785 / inTopicNo.14)  Re[6]: Windows10のIE11において
□投稿者/ アタ (7回)-(2017/04/10(Mon) 09:17:38)
WebSurferさん
詳しい検証ありがとう御座います。
非常に参考になりました。
列挙頂いた対策案から検討したいと思います。

また、「解決済」チェック忘れ失礼致しました。



解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ