none
Windows7+IE11でURLが勝手にデコードされる RRS feed

  • 質問

  • こんにちは。

    Windows7+IE11の環境を使用しています。

    この環境上で、URLエンコードを行ったURLをパラメータに指定し、他の実行ファイルを起動すると、パラメータで渡したURLがデコードされた状態で実行ファイルに渡されてしまい、期待したとおりのURLが指定できません。

    具体的には、下記のような動作をします。

    ■HTML上で実行ファイルに渡すURL

    (前省略)?AuthInfoKey=ABCDEFG1ijtpurgvxBkD4aoc%2BLqXfjE5MDcwO(後省略)

      ↓

    ■実行ファイルが受け取ったURL

    (前省略)?AuthInfoKey=ABCDEFG1ijtpurgvxBkD4aoc+LqXfjE5MDcwO(後省略)

    検証のため、Windows10+IE11の環境で検証しましたが、こちらはエンコードされたままURLが渡され、問題ありませんでした。

    また、起動する実行ファイルに問題が無いかどうかを検証するため、echo %1 pauseとだけ記載した検証用のバッチファイルを作成し、これを実行ファイルの代わりに起動することでパラメータで渡されたURLを確認しましたが、この場合でもURLはデコードされた状態でした。

    現在のところ、IEから実行ファイル(もしくはバッチファイル)を起動する際にURLを渡す際に、何らかのデコードが行われているのではないかと調査していますが、結果を得られておりません。

    このような現象について、何かご存じの方がいらっしゃいましたら、その対処法をご教示いただけると幸いです。

    宜しくお願い申し上げます。


    • 編集済み msrb4 2019年7月11日 5:13
    2019年7月11日 5:12

回答

  • ①IEにて、以下のエンコードされたURLへのリンクを持つボタンをクリック

    (スキーム名)://(前省略)?AuthInfoKey=ABCDEFG1ijtpurgvxBkD4aoc%2BLqXfjE5MDcwO(後省略)

    こちらでは再現しません。"%2B" は "%2B" のままですし、"+" は "+" のままとなっていて、文字が変化する動作を確認することができませんでした。

    Win7+IE11 という組み合わせが問題なのではなく、スキームに関連付けられたという他アプリケーション側の制限を疑った方が良いかもしれません。

    以下、当方での検証手順です。

    Win7 +IE11 環境で、下記のレジストリ設定で msrb4: プロトコルを作成しています。
    HKEY_CLASSES_ROOT\PROTOCOLS には登録していません。

    Windows Registry Editor Version 5.00
    
    [HKEY_CLASSES_ROOT\msrb4]
    @="URL:msrb4 Protocol"
    "URL Protocol"=""
    
    [HKEY_CLASSES_ROOT\msrb4\shell]
    
    [HKEY_CLASSES_ROOT\msrb4\shell\open]
    
    [HKEY_CLASSES_ROOT\msrb4\shell\open\command]
    @="\"C:\\temp\\Project1.exe\" \"%1\""

    C:\temp\Project1.exe は、VB6 で作った実験アプリです。

    Option Explicit
    Private Sub Form_Load()
        Text1.Text = Command()
    End Sub

    さらに Web サイトに、実験用の HTML ファイルを配置します。

    一つ目のリンクは "%2B"、二つ目は "+" を URL に含みます。

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" version="1.0">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>TEST</title>
    </head>
    <body>
    <p><a href="msrb4:blank?displayname=example1&amp;AuthInfoKey=ABCDEFG1ijtpurgvxBkD4aoc%2BLqXfjE5MDcwO">msrb4 - 1</a></p>
    <p><a href="msrb4:blank?displayname=example2&amp;AuthInfoKey=ABCDEFG1ijtpurgvxBkD4aoc+LqXfjE5MDcwO">msrb4 - 2</a></p>
    </body>
    </html>

    次に、上記を配置した Web サーバーの URL を Win7 の IE11 で開き、msrb4 プロトコルのリンクをクリックします。

    起動されたアプリケーション側に、文字列がそのまま渡されていることを確認できます。




    • 編集済み 魔界の仮面弁士MVP 2019年7月11日 11:07 %2B に加えて + の検証も追加
    • 回答としてマーク msrb4 2019年7月12日 0:31
    2019年7月11日 10:57

すべての返信

  • 意味が分かりません。

    「実行ファイル」」とは何ですか? 「HTML上で実行ファイルに渡す」というのはどういう操作ですか?

    問題を再現できるコードや手順等を含めてできるだけ具体的に書いてください。
    2019年7月11日 5:23
  • Web サーバー(Web アプリケーション)でリクエストの URL(とクエリ)を何らかの実行ファイルに起動パラメーターとして渡している、という話なのでしょうか?

    SurferOnWww さんも書かれているように、より具体的な動作の機序を明らかにるるか、検証可能な最小限のサンプルを提示するかしないと、アドバイスを得るのは難しいでしょう。


    Hebikuzure aka Murachi Akira

    2019年7月11日 5:45
    モデレータ
  • 失礼しました。

    具体的には、URLスキームにて他ブラウザを起動する操作になります。

    ①IEにて、以下のエンコードされたURLへのリンクを持つボタンをクリック

    (スキーム名)://(前省略)?AuthInfoKey=ABCDEFG1ijtpurgvxBkD4aoc%2BLqXfjE5MDcwO(後省略)

    ②URLスキームにより、当該スキーム名のレジストリに登録されている他ブラウザの実行ファイル(.exe)を起動。

     起動の際のパラメータには①のURLを指定。

     ↓ここでパラメータのURLがデコード?

     ↓(前省略)?AuthInfoKey=ABCDEFG1ijtpurgvxBkD4aoc+LqXfjE5MDcwO(後省略)

    ③起動した他ブラウザは、渡されたパラメータのURLをデコードしようとするのですが、すでにデコードされたURLに対して再度デコードを行うため、

     (前省略)?AuthInfoKey=ABCDEFG1ijtpurgvxBkD4aoc+LqXfjE5MDcwO(後省略)

     ↓

     (前省略)?AuthInfoKey=ABCDEFG1ijtpurgvxBkD4aocLqXfjE5MDcwO(後省略)

    半角スペースに変換されてしまいます。

    情報が不足していたら申し訳ございません。

    2019年7月11日 8:39
  • ①IEにて、以下のエンコードされたURLへのリンクを持つボタンをクリック

    (スキーム名)://(前省略)?AuthInfoKey=ABCDEFG1ijtpurgvxBkD4aoc%2BLqXfjE5MDcwO(後省略)

    こちらでは再現しません。"%2B" は "%2B" のままですし、"+" は "+" のままとなっていて、文字が変化する動作を確認することができませんでした。

    Win7+IE11 という組み合わせが問題なのではなく、スキームに関連付けられたという他アプリケーション側の制限を疑った方が良いかもしれません。

    以下、当方での検証手順です。

    Win7 +IE11 環境で、下記のレジストリ設定で msrb4: プロトコルを作成しています。
    HKEY_CLASSES_ROOT\PROTOCOLS には登録していません。

    Windows Registry Editor Version 5.00
    
    [HKEY_CLASSES_ROOT\msrb4]
    @="URL:msrb4 Protocol"
    "URL Protocol"=""
    
    [HKEY_CLASSES_ROOT\msrb4\shell]
    
    [HKEY_CLASSES_ROOT\msrb4\shell\open]
    
    [HKEY_CLASSES_ROOT\msrb4\shell\open\command]
    @="\"C:\\temp\\Project1.exe\" \"%1\""

    C:\temp\Project1.exe は、VB6 で作った実験アプリです。

    Option Explicit
    Private Sub Form_Load()
        Text1.Text = Command()
    End Sub

    さらに Web サイトに、実験用の HTML ファイルを配置します。

    一つ目のリンクは "%2B"、二つ目は "+" を URL に含みます。

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" version="1.0">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>TEST</title>
    </head>
    <body>
    <p><a href="msrb4:blank?displayname=example1&amp;AuthInfoKey=ABCDEFG1ijtpurgvxBkD4aoc%2BLqXfjE5MDcwO">msrb4 - 1</a></p>
    <p><a href="msrb4:blank?displayname=example2&amp;AuthInfoKey=ABCDEFG1ijtpurgvxBkD4aoc+LqXfjE5MDcwO">msrb4 - 2</a></p>
    </body>
    </html>

    次に、上記を配置した Web サーバーの URL を Win7 の IE11 で開き、msrb4 プロトコルのリンクをクリックします。

    起動されたアプリケーション側に、文字列がそのまま渡されていることを確認できます。




    • 編集済み 魔界の仮面弁士MVP 2019年7月11日 11:07 %2B に加えて + の検証も追加
    • 回答としてマーク msrb4 2019年7月12日 0:31
    2019年7月11日 10:57
  • 魔界の仮面弁士さん

    ご回答いただきまして、ありがとうございます。

    また、詳細な検証を実施していただきまして、感謝申し上げます。

    再現しませんでしたか。。。

    当方でもIEだけでなく、OSの設定確認や他ブラウザの調査を行っておりますが、原因の特定には至っておりません。

    他ブラウザの可能性が高いということで、こちらを中心に原因調査を進めて参ります。

    皆様、ご協力いただきましてありがとうございます。

    2019年7月12日 0:36
  • 他の環境でも試していますが、やはり、パラメーターを解釈するアプリ側の実装に依存しているものと推察します。

    たとえば、[Win]+[R]の「ファイル名を指定して実行」で下記を呼び出してみます。

    outlook.exe /c ipm.note /m msrb4@example.com&subject=test%20D4aoc%2BLqX&body=EMail%20Test%0Dand%0A%0Dmessages
    notepad.exe subject=test%20D4aoc%2BLqX

    どちらのコマンドラインにも "%2B" が含まれていますが、当方で実験したところ、前者は "+" として表示され、後者は "%2B" のまま処理されることを確認しました。

    • Win10 v1903 (OS ビルド 18362.239)
    • Outlook 2016 / x86 v1906 (ビルド 11727.20230 クイック実行)月次チャネル

    前者のコマンドラインでは Outlook が表示され、件名の "%2B" が "+" に変化しています。

    一方後者では、ユーザーフォールダに配置した "subject=test%20D4aoc%2BLqX.txt" (もしくは "subject=test%20D4aoc%2BLqX" )というファイルがメモ帳で起動される動作となりました。

    このような環境では、Outlook のメール件名に「test D4aoc%2BLqX」という文字列を送り込むために:

    outlook.exe /c ipm.note /m msrb4@example.com&subject=test%20D4aoc%2BLqX

    とするのではなく、多重エンコードして

    outlook.exe /c ipm.note /m msrb4@example.com&subject=test%20D4aoc%252BLqX

    もしくは

    outlook.exe /c ipm.note /m msrb4@example.com&subject=%74%65%73%74%20%44%34%61%6F%63%25%32%42%4C%71%58

    とする必要があります。

    2019年7月13日 4:27