Proxy

Proxy

[1] http_proxy は、 http: URL の処理に使われるべきを指定する環境変数です。

変数名

[13] 他の多くの環境変数がすべて大文字で綴られるのに対し、 http_proxy小文字なのは、 CGI 環境変数 HTTP_PROXY との混同を避けるためです。

[14] HTTPProxy: ヘッダーは (現時点では) 存在しないので通常の要求の処理ではそのような環境変数が設定されることはありませんが、 悪意あるクライアントProxy: ヘッダーを指定することで任意のホストを指定できてしまうとセキュリティー上の問題となります。 (大文字の環境変数が設定された状態で大文字の環境変数を参照するライブラリーの類を呼び出したり、 大文字の環境変数を参照する外部のプログラムを起動したりすると、 その動作が影響を受けることになります。)

[15] 中には現在でもこのような状況を想定せずに HTTP_PROXY を使うプログラムや、大文字と小文字の両方を使うプログラムが存在しているようです。

[16] HTTP鯖アプリケーション鯖、あるいは Webアプリケーションの実装は、 そのようなライブラリープログラムを呼び出すことが無いように注意しなければなりません。

[40] プラットフォームによっては、環境変数名の大文字小文字を区別しません。 そのため大文字小文字で同じ値が得られる場合に無視する実装もあります。 更には、そのような環境での利用も想定した CGI_HTTP_PROXY 環境変数に対応した実装もあります (が普及はしていないようです)。

[17] CGI を使うことが少なくなった現在でも、 HTTP鯖の内部的な利用や CGI とある程度の互換性を持ったWebアプリケーション動作環境等が CGI と同等の環境変数を設定することがあります。

[12] 値が設定される場合、ホスト (ホスト名:ポートを連結した文字列) となることが期待されているようです。

URL scheme

[30] curl は先頭が http://https:// でなければ、 URL scheme の省略とみなすようです。それ以外だと : が含まれていても userinfo の一部とみなしたりします。

[32] curlhttp_proxyhttps:// を指定しても 素のHTTPで接続するようです。

[33] wget: 以外 + :// で始まると URL とみなし、 : 以外 + : + // 以外で始まると UnixFTP の指定 (: の前までがホスト名) とみなすようです。 http:hogeftp://hoge/ になります。

[2] 古い LWPlocalhost:12345 のように scheme が明示されていないと localhost:URL scheme とみなしてしまいます。 http://localhost:12345 のようにすれば回避できます。

userinfo

[34] URL scheme が省略された場合も含め、userinfoプロキシ認証利用者名合言葉を指定できます。

ポート

[31] wget80curl1080既定のポート番号とするようです。

no_proxy

[35] wgetcurl も、 no_proxy での指定は、 URLホストとの比較になります。 URLホスト名前解決したら no_proxy に指定されたIPアドレスに一致するとしても、 プロキシを使わない理由にはしません。

Proxy: ヘッダー

[42] Proxy: ヘッダーは、 CGIメタ変数 HTTP_PROXY に対応するHTTPヘッダーです。

[43] このヘッダーの正当な用法は存在しないとみられます。 HTTP_PROXY 環境変数脆弱性を突く目的で用いられることがあります。

テストデータ

[55] 構文解析のテストデータ:

実装

[4] Proxies - GNU Wget 1.13.4 Manual ( ( 版)) http://www.gnu.org/software/wget/manual/html_node/Proxies.html

[5] cURL - How To Use ( ( 版)) http://curl.haxx.se/docs/manpage.html

[6] Help on Environment variables ( ( 版)) http://lynx.isc.org/lynx2.8.6/lynx2-8-6/lynx_help/keystrokes/environments.html

[7] 66057 – Proxy: $http_proxy should influence proxy settings ( ( 版)) https://bugzilla.mozilla.org/show_bug.cgi?id=66057

[8] LWP::UserAgent - search.cpan.org ( ( 版)) http://search.cpan.org/dist/libwww-perl/lib/LWP/UserAgent.pm#Proxy_attributes

[9] Libwww Proxies and Gateways Setup ( ( 版)) http://www.w3.org/Library/User/Using/Proxy.html

[10] CLI Usage | Heroku Dev Center ( ( 版)) https://devcenter.heroku.com/articles/using-the-cli

[11] Sauce Connect · Sauce Labs Docs ( ( 版)) https://docs.saucelabs.com/reference/sauce-connect/

[18] ssllabs/ssllabs-scan: A command-line reference-implementation client for SSL Labs APIs, designed for automated and/or bulk testing. ( ()) https://github.com/ssllabs/ssllabs-scan/

The rules of Go's ProxyFromEnvironment apply (HTTP_PROXY, HTTPS_PROXY, NO_PROXY, lowercase variants allowed).

[19] GNU Wget 1.17.1 Manual: Proxies ( ()) http://www.gnu.org/software/wget/manual/html_node/Proxies.html

following environment variables:

http_proxy

https_proxy

If set, the http_proxy and https_proxy variables should contain the URLs of the proxies for HTTP and HTTPS connections respectively.

ftp_proxy

This variable should contain the URL of the proxy for FTP connections. It is quite common that http_proxy and ftp_proxy are set to the same URL.

no_proxy

This variable should contain a comma-separated list of domain extensions proxy should not be used for. For instance, if the value of no_proxy is ‘.mit.edu’, proxy will not be used to retrieve documents from MIT.

[20] GNU Wget 1.17.1 Manual: Proxies ( ()) http://www.gnu.org/software/wget/manual/html_node/Proxies.html

Some proxy servers require authorization to enable you to use them. The authorization consists of username and password, which must be sent by Wget. As with HTTP authorization, several authentication schemes exist. For proxy authorization only the Basic authentication scheme is currently implemented.

You may specify your username and password either through the proxy URL or through the command-line options. Assuming that the company’s proxy is located at ‘proxy.company.com’ at port 8001, a proxy URL location containing authorization data might look like this:

http://hniksic:mypassword@proxy.company.com:8001/

Alternatively, you may use the ‘proxy-user’ and ‘proxy-password’ options, and the equivalent .wgetrc settings proxy_user and proxy_password to set the proxy username and password.

[21] cURL - How To Use ( ()) https://curl.haxx.se/docs/manpage.html#--noproxy

--noproxy <no-proxy-list>

Comma-separated list of hosts which do not use a proxy, if one is specified. The only wildcard is a single * character, which matches all hosts, and effectively disables the proxy. Each name in this list is matched as either a domain which contains the hostname, or the hostname itself. For example, local.com would match local.com, local.com:80, and www.local.com, but not www.notlocal.com. (Added in 7.19.4).

[22] cURL - How To Use ( ()) https://curl.haxx.se/docs/manpage.html#ENVIRONMENT

The environment variables can be specified in lower case or upper case. The lower case version has precedence. http_proxy is an exception as it is only available in lower case.

Using an environment variable to set the proxy has the same effect as using the --proxy option.

http_proxy [protocol://]<host>[:port]

Sets the proxy server to use for HTTP.

HTTPS_PROXY [protocol://]<host>[:port]

Sets the proxy server to use for HTTPS.

[url-protocol]_PROXY [protocol://]<host>[:port]

Sets the proxy server to use for [url-protocol], where the protocol is a protocol that curl supports and as specified in a URL. FTP, FTPS, POP3, IMAP, SMTP, LDAP etc.

ALL_PROXY [protocol://]<host>[:port]

Sets the proxy server to use if no protocol-specific proxy is set.

NO_PROXY <comma-separated list of hosts>

list of host names that shouldn't go through any proxy. If set to a asterisk '*' only, it matches all hosts.

[23] W3M FAQ ( ()) http://homepage2.nifty.com/aito/w3m/FAQ.html

環境変数 HTTP_proxy を設定するか,"o" コマンドのオプション設定パネル で設定します.例えば proxy.hogege.com というホストの 8000番ポートを 利用する場合,

http://proxy.hogege.com:8000/

と設定します.

[24] LWP::UserAgent - search.cpan.org ( ()) http://search.cpan.org/dist/libwww-perl/lib/LWP/UserAgent.pm#Proxy_attributes

Load proxy settings from *_proxy environment variables. You might specify proxies like this (sh-syntax):

gopher_proxy=http://proxy.my.place/

wais_proxy=http://proxy.my.place/

no_proxy="localhost,example.com"

export gopher_proxy wais_proxy no_proxy

csh or tcsh users should use the setenv command to define these environment variables.

On systems with case insensitive environment variables there exists a name clash between the CGI environment variables and the HTTP_PROXY environment variable normally picked up by env_proxy(). Because of this HTTP_PROXY is not honored for CGI scripts. The CGI_HTTP_PROXY environment variable can be used instead.

[25] プロキシ下でLinuxを使う際のメモ - Λlisue's blog ( ()) http://lambdalisue.hatenablog.com/entry/2013/06/25/140630

# 認証が必要なプロキシの場合

PROXY="$USERNAME:$PASSWORD@$HOST:$PORT"

# 認証が不要なプロキシの場合

PROXY="$HOST:$PORT"

# 実際の環境変数の設定

export http_proxy="http://$PROXY"

export https_proxy="https://$PROXY"

export ftp_proxy="ftp://$PROXY"

# 大文字バージョンしか認識しないプログラム用

export HTTP_PROXY="http://$PROXY"

export HTTPS_PROXY="https://$PROXY"

export FTP_PROXY="ftp://$PROXY"

# プロキシを利用しないアドレスの指定(必須)

export no_proxy="127.0.0.1,localhost"

export NO_PROXY="$no_proxy"

[26] いつか見た惑星: プロキシ環境下でgitを使う ( ()) http://sushichop.blogspot.jp/2013/09/git.html

認証付きプロキシサーバの場合は認証ID、PW込みでプロキシ指定する。また、認証ID、PW、プロキシサーバURLにURIとして使用できない文字(@等)が含まれる場合はURLエンコードすること。

書式

$ git config --global http.proxy http://認証ID:認証PW@プロキシサーバのURL:ポート番号

$ git config --global https.proxy http://認証ID:認証PW@プロキシサーバのURL:ポート番号

設定例(認証IDがfoo.bar@example.com、認証PWがhogepassの場合)

$ git config --global http.proxy http://foo.bar%40example.com:hogepass@proxy.example.com:8080

$ git config --global https.proxy http://foo.bar%40example.com:hogepass@proxy.example.com:8080

[27] no_proxy にネットワークアドレスとかワイルドカードを指定しても期待通りに動かない、でどうするかというお話 - 双六工場日誌 ( ()) http://sechiro.hatenablog.com/entry/2013/08/06/no_proxy_%E3%81%AB%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E3%81%A8%E3%81%8B%E3%83%AF%E3%82%A4%E3%83%AB%E3%83%89%E3%82%AB%E3%83%BC%E3%83%89%E3%82%92

ただ、この際の「no_proxy」の仕様が曲者で、僕が確認したプログラムではここに設定できるのは「IPアドレス」もしくは「ドメイン名」のみとなっており、プロキシを経由したくないIPアドレスを複数指定する場合は、IPアドレスをひたすらカンマ区切りで列挙する必要があります。たとえば、内部サーバへの接続の際にIPアドレスをそのまま使っている場合、プロキシ経由してほしくないIPアドレスのすべてをここに書き下すことになります。 たとえば"192.168.0.0/24"とか"172.16.0.*"といった、ネットワークアドレスでの指定やワイルドカードでの指定は期待通りの動作になりません。

[28] 821655 – System proxy settings via $http_proxy/$HTTP_PROXY are not recognized anymore ( ()) https://bugzilla.mozilla.org/show_bug.cgi?id=821655

[29] lftp.1 ( ()) http://lftp.yar.ru/lftp-man.html

ftp:proxy (URL)

specifies FTP proxy to use. To disable proxy set this to empty string. Note that it

is a FTP proxy which uses FTP protocol, not FTP over HTTP. Default value is taken from

environment variable ftp_proxy if it starts with ``ftp://. If your FTP proxy

requires authentication, specify user name and password in the URL. If ftp:proxy

starts with http:// then hftp protocol (FTP over HTTP proxy) is used instead of FTP

automatically.

[36] httpoxy () https://httpoxy.org/

[37] Class: URI::Generic (Ruby 2.3.1) () http://ruby-doc.org/stdlib-2.3.1/libdoc/uri/rdoc/URI/Generic.html#method-i-find_proxy

returns a proxy URI. The proxy URI is obtained from environment variables such as http_proxy, ftp_proxy, no_proxy, etc. If there is no proper proxy, nil is returned.

Note that capitalized variables (HTTP_PROXY, FTP_PROXY, NO_PROXY, etc.) are examined too.

But http_proxy and HTTP_PROXY is treated specially under CGI environment. It’s because HTTP_PROXY may be set by Proxy: header. So HTTP_PROXY is not used. http_proxy is not used too if the variable is case insensitive. CGI_HTTP_PROXY can be used instead.

[38] Re: libwww-perl-5.51 (with CGI security fix) - nntp.perl.org () http://www.nntp.perl.org/group/perl.libwww/2001/03/msg2249.html

Changes since release 5.50 are:

SECURITY FIX: If LWP::UserAgent::env_proxy is called in a CGI

environment, the case-insensitivity when looking for "http_proxy"

permits "HTTP_PROXY" to be found, but this can be trivially set by the

web client using the "Proxy:" header. The fix applied is that

$ENV{HTTP_PROXY} is not longer honored for CGI scripts.

The CGI_HTTP_PROXY environment variable can be used instead.

Problem reported by Randal L. Schwartz.

[39] we don't use the HTTP_PROXY environment variable in uppercase anymore… (bagder著, ) https://github.com/curl/curl/commit/18f044f19d26f2b6dcd41796966f488a62a1bdca

[41] net/http, net/http/cgi: fix HTTP_PROXY security issue · Issue #16405 · golang/go () https://github.com/golang/go/issues/16405

[44] Mitigating the HTTPoxy Vulnerability with NGINX () https://www.nginx.com/blog/mitigating-the-httpoxy-vulnerability-with-nginx/

[45] 1048535 – Cross-origin info leak: [[get]] calls on global expose text (or CSV) sniffed as JS () https://bugzilla.mozilla.org/show_bug.cgi?id=1048535

[46] sources.list(5) — apt — Debian jessie — Debian Manpages ( ()) https://manpages.debian.org/jessie/apt/sources.list.5.en.html#URI_SPECIFICATION

If an environment variable http_proxy is set with the format http://server:port/, the proxy server specified in http_proxy will be used. Users of authenticated HTTP/1.1 proxies may use a string of the format http://user:pass@server:port/. Note that this is an insecure method of authentication.

[47] sources.list(5) — apt — Debian jessie — Debian Manpages ( ()) https://manpages.debian.org/jessie/apt/sources.list.5.en.html#URI_SPECIFICATION

Please note that an FTP proxy can be specified by using the ftp_proxy environment variable. It is possible to specify an HTTP proxy (HTTP proxy servers often understand FTP URLs) using this environment variable and only this environment variable. Proxies using HTTP specified in the configuration file will be ignored.

[48] Loosen `noProxy` values. (shs96c著, ) https://github.com/w3c/webdriver/commit/1d43225b164368a835ed401a4edcdaadb8b6bf0e

[49] Clarify validation of noProxy entries to not only be hosts or IP addresses · Issue #1068 · w3c/webdriver () https://github.com/w3c/webdriver/issues/1068

[50] Loosen `noProxy` values. by shs96c · Pull Request #1070 · w3c/webdriver () https://github.com/w3c/webdriver/pull/1070

[51] No Proxy For configuration | MDN () https://developer.mozilla.org/en-US/docs/No_Proxy_For_configuration

[52] Specify secure web proxy with a password · Issue #1150 · w3c/webdriver () https://github.com/w3c/webdriver/issues/1150

[53] mpg123(1): play audio MPEG 1.0/2.0/2.5 stream - Linux man page () https://linux.die.net/man/1/mpg123

mpg123 examines the environment for variables named MP3_HTTP_PROXY, http_proxy and HTTP_PROXY, in this order.

[54] AnyEvent::HTTP - search.cpan.org () http://search.cpan.org/dist/AnyEvent-HTTP/HTTP.pm#GLOBAL_FUNCTIONS_AND_VARIABLES

When AnyEvent::HTTP is loaded for the first time it will query the default proxy from the operating system, currently by looking at $ENV{http_proxy}.

[57] Configure Docker to use a proxy server | Docker Documentation () https://docs.docker.com/network/proxy/

[58] class URI::Generic (Ruby 2.6.0) () https://docs.ruby-lang.org/ja/latest/class/URI=3a=3aGeneric.html

プロキシ URI は http_proxy, ftp_proxy, no_proxy などの環境変数から取得 します。適切なプロキシが見つからない場合は nil を返します。

環境変数は大文字にしたもの(HTTP_PROXY, FTP_PROXY, NO_PROXYなど)も調べら れる事に注意してください。

ただし、CGI環境下では http_proxy と HTTP_PROXY は特別扱いされます。 HTTP_PROXY はヘッダ Proxy: に設定されうるためです。そのため、 HTTP_PROXY(環境変数が大文字小文字を区別しない場合は http_proxy も) は使 われません。代わりに CGI_HTTP_PROXY が使われます。

[59] curl - How To Use (, ) https://curl.haxx.se/docs/manpage.html#--preproxy

[60] curl - How To Use (, ) https://curl.haxx.se/docs/manpage.html#-x

[61] GNU Wget 1.20 Manual () https://www.gnu.org/software/wget/manual/wget.html#index-proxies

[62] Command-Line Interface — Streamlink 1.6.0 documentation (, ) https://streamlink.github.io/cli.html#proxy-support

[63] ytdl-org/youtube-dl: Command-line program to download videos from YouTube.com and other video sites () https://github.com/ytdl-org/youtube-dl#network-options