tag:crieit.net,2005:https://crieit.net/tags/Word/feed 「Word」の記事 - Crieit Crieitでタグ「Word」に投稿された最近の記事 2021-04-04T11:51:18+09:00 https://crieit.net/tags/Word/feed tag:crieit.net,2005:PublicArticle/16815 2021-04-04T11:49:41+09:00 2021-04-04T11:51:18+09:00 https://crieit.net/posts/any-browser-regard-ie-from-excel-hyperlink-20210404 Excel 内のハイパーリンクを踏むと IE 扱いされる <p>Excel 内のハイパーリンクを踏むと、 Chrome で開いているのに IE 扱いされる現象に遭遇しました。</p> <h2 id="現象"><a href="#%E7%8F%BE%E8%B1%A1">現象</a></h2> <p>上述の通りですが、</p> <ol> <li>Excel の中でオレオレ証明書の <code>https</code> 始まりのハイパーリンクを設定する</li> <li>1.のハイパーリンクを開く</li> </ol> <p>とすると、 <code>.htaccess</code> でユーザエージェントで IE のみリダイレクトして専用ページを開く仕掛けが発動してしまいました。……実際ページを開いているブラウザは Chrome や Vivaldi なのに……。</p> <h2 id="検証"><a href="#%E6%A4%9C%E8%A8%BC">検証</a></h2> <p>この現象について少し調べてみました。</p> <p>試しに、以下のような アクセス元のユーザエージェント + HTTPメソッド を <code>log/test.log</code> というファイルに追記していく PHPコード を作成し、ここに 各Office製品 からハイパーリンク越しでアクセスしてみました。</p> <pre><code class="php"><?php $requestHeaders = apache_request_headers(); unset($requestHeaders['Cookie']); $requestHeaders['Method'] = $_SERVER['REQUEST_METHOD']; $str = ''; $log = ''; foreach ($requestHeaders as $key => $value) { $str .= $key . ': ' . $value . "\n"; } if(array_key_exists('User-Agent', $requestHeaders)) { $log .= 'User-Agent: ' . $requestHeaders['User-Agent']; } if(array_key_exists('Accept', $requestHeaders)) { $log .= ', Accept: ' . $requestHeaders['Accept']; } if(array_key_exists('Referer', $requestHeaders)) { $log .= ', Referer: ' . $requestHeaders['Referer']; } if(array_key_exists('Method', $requestHeaders)) { $log .= ', Method: ' . $requestHeaders['Method']; } $log .= ';'; $filepath = __DIR__ . '/log/test.log'; $current = ''; if(file_exists($filepath)) { $current = file_get_contents($filepath); $current .= "\n\n" . $log; } else { $current = $log; } file_put_contents($filepath, $current); ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <div style="padding: 1rem; margin: 1rem;"> <textarea name="header" id="header" cols="100" rows="20"><?= $str; ?></textarea> </div> <div style="padding: 1rem; margin: 1rem;"> <textarea name="ua" id="ua" cols="100" rows="20"></textarea> </div> <script> const ua = navigator.userAgent.toLowerCase(); const ver = navigator.appVersion.toLowerCase(); const $ua = document.querySelector('#ua'); $ua.textContent = `UA: ${ua} VERSION: ${ver} `; </script> </body> </html> </code></pre> <h2 id="検証結果"><a href="#%E6%A4%9C%E8%A8%BC%E7%B5%90%E6%9E%9C">検証結果</a></h2> <h3 id="Excel 2016 (httpsリンク、オレオレ証明書)"><a href="#Excel+2016+%28https%E3%83%AA%E3%83%B3%E3%82%AF%E3%80%81%E3%82%AA%E3%83%AC%E3%82%AA%E3%83%AC%E8%A8%BC%E6%98%8E%E6%9B%B8%29">Excel 2016 (httpsリンク、オレオレ証明書)</a></h3> <pre><code>User-Agent: Microsoft Office Protocol Discovery, Method: OPTIONS; User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.2; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; ms-office), Accept: */*, Method: GET; User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.186 Safari/537.36, Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9, Method: GET; </code></pre> <p>最後のユーザエージェントは Chrome のものなので問題ないのですが、問題はその前。</p> <ol> <li><code>OPTIONS</code>メソッド で <code>Microsoft Office Protocol Discovery</code> なるユーザエージェントでリクエストが飛んでくる</li> <li><code>GET</code>メソッド で <code>MSIE</code> や <code>Trident</code> を含む (今回はこの2つで IE 判定をしていた) IE のようなユーザエージェントでリクエストが飛んでくる</li> <li>Chrome 本体のリクエスト</li> </ol> <p>という順番のようです。特に2番目。 IE そのものとはまた異なりますが、 IE と判定されそうな文字列を含むユーザエージェントです。これによりリダイレクト判定に引っかかり、リダイレクトした後の URL が Chrome に渡されるため、「 IE 扱いされた」挙動となったようです。</p> <p>……何故こんなことに……。</p> <p><a href="https://crieit.now.sh/upload_images/2ddbdb41a73d07e7cdbf430306128af9606929630af71.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/2ddbdb41a73d07e7cdbf430306128af9606929630af71.jpg?mw=700" alt="Excel からオレオレ証明書のhttpsリンクを開こうとすると表示されるポップアップ" /></a></p> <p><a href="https://crieit.now.sh/upload_images/ef043154d236673103a5708bfaabf4b46069297f3d388.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/ef043154d236673103a5708bfaabf4b46069297f3d388.jpg?mw=700" alt="Excel からオレオレ証明書のhttpsリンクを開こうとすると表示されるポップアップ" /></a></p> <p>ちなみに。</p> <h3 id="Excel 2016 (httpリンク)"><a href="#Excel+2016+%28http%E3%83%AA%E3%83%B3%E3%82%AF%29">Excel 2016 (httpリンク)</a></h3> <pre><code>User-Agent: Microsoft Office Excel 2014, Method: HEAD; User-Agent: Mozilla/4.0 (compatible; ms-office), Accept: */*, Method: GET; User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36, Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9, Method: GET; </code></pre> <p>こちらは <code>MSIE</code> や <code>Trident</code> といった文字列がユーザエージェントに出てこないため、 Chrome で正常に表示ができました。</p> <p>ちなみに、本来のブラウザのアクセス前に飛ぶリクエストも <code>OPTIONS</code>メソッド ではなく <code>HEAD</code>メソッド で飛んできています。</p> <h3 id="Word 2016 (https, http)"><a href="#Word+2016+%28https%2C+http%29">Word 2016 (https, http)</a></h3> <pre><code>User-Agent: Microsoft Office Word 2014, Method: HEAD; User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36, Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9, Method: GET; </code></pre> <p>Word 2016 については httpリンク の Excel と同様 <code>MSIE</code> や <code>Trident</code> といった文字列がユーザエージェントに出てきませんでした。</p> <p><a href="https://crieit.now.sh/upload_images/62a307641d00ee2d0bd131741d9f80246069298d61604.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/62a307641d00ee2d0bd131741d9f80246069298d61604.jpg?mw=700" alt="Word からオレオレ証明書のhttpsリンクを開こうとすると表示されるポップアップ" /></a></p> <p><a href="https://crieit.now.sh/upload_images/72f6ec11fbbe1df88892dadc414054546069299b2f723.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/72f6ec11fbbe1df88892dadc414054546069299b2f723.jpg?mw=700" alt="Word からオレオレ証明書のhttpsリンクを開こうとすると表示されるポップアップ" /></a></p> <h3 id="Excel 2013 (httpsリンク、オレオレ証明書)"><a href="#Excel+2013+%28https%E3%83%AA%E3%83%B3%E3%82%AF%E3%80%81%E3%82%AA%E3%83%AC%E3%82%AA%E3%83%AC%E8%A8%BC%E6%98%8E%E6%9B%B8%29">Excel 2013 (httpsリンク、オレオレ証明書)</a></h3> <pre><code>User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; Tablet PC 2.0; ms-office), Accept: */*, Method: GET; User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.116 Safari/537.36, Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9, Method: GET; </code></pre> <p>Excel 2013 だと <code>OPTIONS</code>メソッド が見当たりません。ただ、 <code>MSIE</code> や <code>Trident</code> が含まれているのは確認できます。</p> <h3 id="Excel 2013 (httpリンク)"><a href="#Excel+2013+%28http%E3%83%AA%E3%83%B3%E3%82%AF%29">Excel 2013 (httpリンク)</a></h3> <pre><code>User-Agent: Microsoft Office Excel 2013 (15.0.5319) Windows NT 10.0, Method: HEAD; User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.116 Safari/537.36, Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9, Method: GET; </code></pre> <p>こちらは 2016 と変わらなそうです。</p> <h3 id="Word 2013 (httpsリンク、オレオレ証明書)"><a href="#Word+2013+%28https%E3%83%AA%E3%83%B3%E3%82%AF%E3%80%81%E3%82%AA%E3%83%AC%E3%82%AA%E3%83%AC%E8%A8%BC%E6%98%8E%E6%9B%B8%29">Word 2013 (httpsリンク、オレオレ証明書)</a></h3> <pre><code>User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; Tablet PC 2.0; ms-office), Accept: */*, Method: GET; User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.116 Safari/537.36, Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9, Method: GET; </code></pre> <p>Word 2013 はなんと Excel 2013 と同じ結果に。これだと <code>MSIE</code> や <code>Trident</code> が含まれています。</p> <h3 id="Excel 2013 (httpリンク)"><a href="#Excel+2013+%28http%E3%83%AA%E3%83%B3%E3%82%AF%29">Excel 2013 (httpリンク)</a></h3> <pre><code>User-Agent: Microsoft Office Word 2013 (15.0.5319) Windows NT 10.0, Method: HEAD; User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; Tablet PC 2.0; ms-office), Accept: */*, Method: GET; User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.116 Safari/537.36, Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9, Method: GET; </code></pre> <p>さらに Word 2013 で httpリンク の場合、 <code>HEAD</code>メソッドが飛ぶのは Excel2013 と同様ですが、その後に <code>MSIE</code> や <code>Trident</code> を含む <code>GET</code>リクエストが飛んでいます。</p> <p>これだとユーザーエージェント判定で引っかかることになりますね……。</p> <hr /> <p>手元の環境では、同じ Office製品 でもバージョンで挙動が異なるというかなり困った結果が得られてしまいました……。</p> <p>Office製品 からのハイパーリンクを気にすることはほとんどないとは思うのですが、このような事象もあるということでメモしておきます。</p> <h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://answers.microsoft.com/ja-jp/msoffice/forum/all/%E3%82%A8%E3%82%AF%E3%82%BB%E3%83%AB%E3%82%B7/b20bda72-1187-420c-bb43-e8206c2eb80a">エクセルシートのリンクを使ってアクセスした場合に、保証の切れたインターネットエクスプローラーと認識され、アクセス - マイクロソフト コミュニティ</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://www.ka-net.org/blog/?p=3699">[Office用アプリ]User Agent他を調べてみました。 | 初心者備忘録</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://www.ka-net.org/blog/?p=4222">ExcelのWebクエリからのアクセス情報 | 初心者備忘録</a></li> </ul> arm-band