1. ホーム
  2. http

[解決済み] HTTPS ページにおける HTTP コンテンツの扱いについて

2023-02-10 08:23:57

質問

全てHTTPSでアクセスするサイトがあるのですが、時々 外部コンテンツ を表示することがあります (主に RSS フィードの画像)。 また、私たちのユーザーの大半は IE6 で止まっています。

私は理想的には、次の両方を行いたいと思います。

  • 安全でないコンテンツに関する IEの警告メッセージを表示しないようにする (たとえば、画像を以下のようなデフォルトのアイコンに置き換えることで、より控えめなものを表示できるようにする)
  • どの画像が読み込まれていないかを調べ、代わりに私たちの画像に置き換えるために実行できる JS があれば、それは素晴らしいことです。

最初の目的は単純に不可能だと思いますが、2 番目の目的は十分かもしれません。

最悪のシナリオは、RSS フィードをインポートするときに解析し、画像を取得してローカルに保存し、ユーザーがその方法でアクセスできるようにすることですが、それは合理的に小さな利益のために多くの苦痛のように思えます。

どのように解決するのですか?

最悪のシナリオは、あなたが思っているほど悪くないのです。

あなたはすでにRSSフィードを解析しているので、画像のURLはすでに持っています。例えば、次のような画像 URL があるとします。 http://otherdomain.com/someimage.jpg . この URL を次のように書き換えます。 https://mydomain.com/imageserver?url=http://otherdomain.com/someimage.jpg&hash=abcdeafad . こうすることで、ブラウザは常にhttpsでリクエストを行うようになり、問題が解消されます。

次の部分 - プロキシページまたはサーブレットを作成し、次のことを行います - 。

  1. クエリ文字列から url パラメータを読み取り、ハッシュを検証します。
  2. サーバーから画像をダウンロードし、ブラウザにプロキシで返します。
  3. オプションで、画像をディスクにキャッシュします。

この解決策にはいくつかの利点があります。html を作成するときに画像をダウンロードする必要がない。画像をローカルに保存する必要がありません。また、ステートレスです。urlには画像を提供するために必要なすべての情報が含まれています。

最後に、hashパラメータはセキュリティのためです。サーブレットが画像を提供するのは、あなたが作成したURLに対してのみです。そのため、url を作成する際に md5(image_url + secret_key) を計算し、それをハッシュパラメータとして追加します。リクエストを処理する前に、ハッシュを再計算し、渡されたものと比較します。secret_key はあなただけが知っているので、他の誰も有効な URL を作成することはできません。

もしあなたがJavaで開発しているなら、サーブレットは数行のコードです。他のバックエンド技術に以下のコードを移植することができるはずです。

/*
targetURL is the url you get from RSS feeds
request and response are wrt to the browser
Assumes you have commons-io in your classpath
*/

protected void proxyResponse (String targetURL, HttpServletRequest request,
 HttpServletResponse response) throws IOException {
    GetMethod get = new GetMethod(targetURL);
    get.setFollowRedirects(true);    
    /*
     * Proxy the request headers from the browser to the target server
     */
    Enumeration headers = request.getHeaderNames();
    while(headers!=null && headers.hasMoreElements())
    {
        String headerName = (String)headers.nextElement();

        String headerValue = request.getHeader(headerName);

        if(headerValue != null)
        {
            get.addRequestHeader(headerName, headerValue);
        }            
    }        

    /*Make a request to the target server*/
    m_httpClient.executeMethod(get);
    /*
     * Set the status code
     */
    response.setStatus(get.getStatusCode());

    /*
     * proxy the response headers to the browser
     */
    Header responseHeaders[] = get.getResponseHeaders();
    for(int i=0; i<responseHeaders.length; i++)
    {
        String headerName = responseHeaders[i].getName();
        String headerValue = responseHeaders[i].getValue();

        if(headerValue != null)
        {
            response.addHeader(headerName, headerValue);
        }
    }

    /*
     * Proxy the response body to the browser
     */
    InputStream in = get.getResponseBodyAsStream();
    OutputStream out = response.getOutputStream();

    /*
     * If the server sends a 204 not-modified response, the InputStream will be null.
     */
    if (in !=null) {
        IOUtils.copy(in, out);
    }    
}