Bug #4388
closedopen-uriで環境変数http_proxyを使うときに認証付きのProxyが使えません
Description
=begin
内容はタイトルのままです。
パッチを添付しますのでよろしくお願いします。
=end
Files
Updated by akr (Akira Tanaka) over 13 years ago
=begin
2011年2月10日14:15 あつし よしだ redmine@ruby-lang.org:
Bug #4388: open-uriで環境変数http_proxyを使うときに認証付きのProxyが使えません
http://redmine.ruby-lang.org/issues/show/4388
内容はタイトルのままです。
マルチユーザ環境において環境変数は他人から見られるものであり、
パスワードを入れるのに適切な場所ではないので、
この変更は受け入れられません。
[田中 哲][たなか あきら][Tanaka Akira]
=end
Updated by yalab (あつし よしだ) over 13 years ago
=begin
環境変数にパスワードを入れるかどうかは使用者の判断と責任ではないでしょうか。
不適切だと言うのであればユーザー名、パスワードのみを無視するのは挙動としておかしくないですか?
「認証があっても無くてもhttp_proxyを無視する」か「ユーザー名がはいっていた場合例外か警告を出す」としたほうが利用者の混乱が少なくなると思います。
=end
Updated by akr (Akira Tanaka) over 13 years ago
=begin
2011年2月11日12:59 あつし よしだ redmine@ruby-lang.org:
チケット #4388 が更新されました。 (by あつし よしだ)
環境変数にパスワードを入れるかどうかは使用者の判断と責任ではないでしょうか。
不適切だと言うのであればユーザー名、パスワードのみを無視するのは挙動としておかしくないですか?
とくにおかしいとは思いません。
http_proxy は URI ですが、query や fragment など他にも無視するところは
たくさんあります。
[田中 哲][たなか あきら][Tanaka Akira]
=end
Updated by sorah (Sorah Fukumori) over 13 years ago
=begin
#ruby-ja @ircnetでも出ていましたが、warningを出力しながらも使用するというのはどうでしょうか。
patchも書きました
2011/2/11 Tanaka Akira akr@fsij.org:
とくにおかしいとは思いません。
http_proxy は URI ですが、query や fragment など他にも無視するところは
たくさんあります。
--
Shota Fukumori a.k.a. @sora_h - http://codnote.net/
Attachment: open-uri_with_http_proxy2.patch
=end
Updated by matz (Yukihiro Matsumoto) over 13 years ago
=begin
まつもと ゆきひろです
In message "Re: [ruby-dev:43195] Re: [Ruby 1.9-Bug#4388] open-uriで環境変数http_proxyを使うときに認証付きのProxyが使えません"
on Fri, 11 Feb 2011 20:08:51 +0900, Mitsuru Ogino ogino@verama.net writes:
|Tanaka Akira said the following on 11/02/10 17:00:
|> マルチユーザ環境において環境変数は他人から見られるものであり、
|> パスワードを入れるのに適切な場所ではないので、
|> この変更は受け入れられません。
|
|「環境変数が他人から見られる」というのは OS 依存ではないでしょうか。一部
|の OS でセキュリティが確保されていないからというのも個人としては違和感が
|あります。
「一部のOS」で危険であれば採用しない理由として十分に有効だと
思いますよ。
|いずれにせよユーザとしては環境変数 http_proxy の取扱いは一般的なコマンド
|に倣って欲しいと思うのですが。こういう意見もあるということで。
「一般的なコマンド」では環境変数にパスワードをいれる形でHTTP
プロキシを利用しているのですか。その「一般的なコマンド」の例
を教えていただけませんか?
=end
Updated by akr (Akira Tanaka) over 13 years ago
=begin
2011年2月11日23:08 Mitsuru Ogino ogino@verama.net:
そういう意見もあるとは思います。なにが危険かというのをライブラリ側が決め
るかユーザが決めるかという問題でもありますが。環境変数が他のユーザに公開
される OS(BSD系?)でも、会社などではローカルユーザにはプロキシサーバの
パスワードを秘密にする必要がないところもあると思います。
危険がない状況が存在する事自体はわかっています。
[ruby-dev:43187] でも「マルチユーザ環境」と書きましたが、
シングルユーザ環境ではまず問題ないでしょう。
しかし、open-uri.rb はそういう状況に限定して使われるものではないので、
サポートしないという方針です。
「一般的なコマンド」では環境変数にパスワードをいれる形でHTTP
プロキシを利用しているのですか。その「一般的なコマンド」の例
を教えていただけませんか?ググった範囲で申し訳ありませんが、以下のようなコマンドが対応しているよう
です。
他のアプリケーションについては、設定ファイルに記述できることを願っています。¶
[田中 哲][たなか あきら][Tanaka Akira]
=end
Updated by yalab (あつし よしだ) over 13 years ago
=begin
よしだあつしです。
Rubyのポリシーとして環境変数にパスワードは書いてはいけないということはわかりました。
ただ私が問題だと思ったのはcurlやwgetでは受け入れられているものが
「何も言わずに無視される」点です。
無視するにしてもせめてwarningを出すということは無理なのでしょうか?
On Mon, 14 Feb 2011 13:00:27 +0900
Tanaka Akira akr@fsij.org wrote:
2011年2月11日23:08 Mitsuru Ogino ogino@verama.net:
そういう意見もあるとは思います。なにが危険かというのをライブラリ側が決め
るかユーザが決めるかという問題でもありますが。環境変数が他のユーザに公開
される OS(BSD系?)でも、会社などではローカルユーザにはプロキシサーバの
パスワードを秘密にする必要がないところもあると思います。危険がない状況が存在する事自体はわかっています。
[ruby-dev:43187] でも「マルチユーザ環境」と書きましたが、
シングルユーザ環境ではまず問題ないでしょう。しかし、open-uri.rb はそういう状況に限定して使われるものではないので、
サポートしないという方針です。「一般的なコマンド」では環境変数にパスワードをいれる形でHTTP
プロキシを利用しているのですか。その「一般的なコマンド」の例
を教えていただけませんか?ググった範囲で申し訳ありませんが、以下のようなコマンドが対応しているよう
です。他のアプリケーションについては、設定ファイルに記述できることを願っています。¶
[田中 哲][たなか あきら][Tanaka Akira]
よしだあつし rudeboyjet@gmail.com
http://ya-lab.org あなたのハートにinject
=end
Updated by akr (Akira Tanaka) over 13 years ago
- ruby -v changed from ruby 1.9.2p136 (2010-12-25 revision 30365) [i686-linux] to -
Updated by akr (Akira Tanaka) over 13 years ago
=begin
2011年2月17日16:13 よしだあつし rudeboyjet@gmail.com:
ただ私が問題だと思ったのはcurlやwgetでは受け入れられているものが
「何も言わずに無視される」点です。
無視するにしてもせめてwarningを出すということは無理なのでしょうか?
穏やかに移行するには警告は邪魔なんじゃないですかねぇ。¶
[田中 哲][たなか あきら][Tanaka Akira]
=end
Updated by yalab (あつし よしだ) over 13 years ago
=begin
もう説得の材料が思いつかないのであきらめます。チケットもクローズしてください。
=end
Updated by sorah (Sorah Fukumori) over 13 years ago
- Status changed from Open to Rejected
Updated by nahi (Hiroshi Nakamura) over 13 years ago
open-uri.rbのproxy auth周りのAPIがイケてない、少なくとも覚えられない、というのも関係していると思います。
汎用的に書こうとするとこんな感じ。
https://github.com/nahi/odrk-http-client/blob/master/sample/sample_open-uri.rb
one-linerで思い出しつつ書くのも至難の業でしょう。田中さんとしてはこれも意図的ですかね?
アクセス先フィルタリングと利用記録のためにproxy auth使ったりする企業もありますから、
APIが覚えられない、汎用的に書きにくい、one-linerで書けないってのは、open-uri.rbの利用シーンを
それなりに制限しそうではあります。
Updated by kosaki (Motohiro KOSAKI) over 8 years ago
- Description updated (diff)
こちら、いままさに私もはまっています。
現代的において認証つきPROXYを使っているのは企業ネットワークで認証つきPROXYを使っており、外に出るのに必要という
状況であり、マルチユーザではつかわないか、もしくは、シェアするのは全員同僚という環境だと思います。
よって、わたしもそうですが、wgetその他を通すために環境変数にパスワードは入れています。他に方法がないので。
デスクトップのwidgetなど含めるとHTTP使うソフトは100を超えるので設定してられないし、設定ファイルないものも多い。
よって、実質的にはrubyのこの気遣いはセキュリティ向上にほぼ貢献していないと認識しています。
現在、http_proxy, HTTP_PROXYのユーザ、パスワードを無視するのって、rubyとemacsだけですかね。わたしが普段つかう環境だと。
あまりに不便なので(OSにバンドルされてパッケージのどれがRubyで実装されてるかなんて知らんがな)、変更を提案します。
論旨としては
1) セキュリティ的に問題になるのは環境変数に格納した時点であり、環境変数に格納されているパスワードを Ruby が無視したところで
セキュリティはまったく上がっていない。
2) 他のソフトのために、環境変数にパスワードをいれざる得ないので、Rubyの挙動によってユーザーの行動を変える方向に促すことが出来るとは思えない
3) 実運用的には、認証PROXYの内側にいる場合でかつ、マシンを共有するユーザーがuntrustなケースは、21世紀にはほぼ思いつかない
の3点により、セキュリティが向上しておらず、単に不便を強要するだけに終わっていると思います。
RUBY_PROXY_AUTH_BY_ENV=1 みたいな環境変数で opt-in でもいいですが、たんにFAQが増えるだけじゃないかなあ。
Updated by kosaki (Motohiro KOSAKI) over 8 years ago
いちおうPythonでどうしてるかは調べました。urllib.request.urlopenが同等のようですが、環境変数のパスワードをしっかり
読んでます。だって、それがデファクトだから。
すでにデファクト仕様が決まっちゃってるものに対して、Rubyだけ逆らうのに意味があるとは思えません。
https://github.com/python/cpython/blob/master/Lib/urllib/request.py#L779
Updated by kosaki (Motohiro KOSAKI) over 8 years ago
perlのLWPも環境変数のパスワード使いますね。
perl -MLWP::Simple -e 'getprint "http://www.google.com"'
で、確認。
ソースがとっちらかってて1行でうまくポイントできないけど。
Updated by akr (Akira Tanaka) over 8 years ago
しばたさんがしばらく前に r54432 を入れてましたが、trunk の状態についてはどうですか。
Updated by kosaki (Motohiro KOSAKI) over 8 years ago
あ、ごめんなさい。しばたさんの変更に気づいていませんでした。確認のうえ、返信します。ごめんなさい。
Updated by kosaki (Motohiro KOSAKI) about 8 years ago
実験してみたのですが、まずrubyの./configureの段階で、tool/downloader.rbがhttps接続を使うので、
open_httpのところのhttpsをはじく処理をコメントアウトしないと動きませんでした。
def OpenURI.open_http(buf, target, proxy, options) # :nodoc:
if proxy
proxy_uri, proxy_user, proxy_pass = proxy
raise "Non-HTTP proxy URI: #{proxy_uri}" if proxy_uri.class != URI::HTTP¶
end
httpsのときは、https_proxy環境変数読むので、URI::HTTPにならない気がするのですが、どういう意図なのでしょうか。
2つ目。環境変数から読むときは入力がURLなのに、URLエンコードを意識していないので、以下のようにしないと動きませんでした。
(たとえば、うちの会社だとproxy_userがメアドなので@をエンコードしてやらないといけない)
diff --git a/lib/open-uri.rb b/lib/open-uri.rb
index 489b83a..f588455 100644
--- a/lib/open-uri.rb
+++ b/lib/open-uri.rb
@@ -272,6 +272,8 @@ def OpenURI.open_http(buf, target, proxy, options) # :nodoc:
if proxy
unless proxy_user && proxy_pass
proxy_user, proxy_pass = proxy_uri.userinfo.split(':') if proxy_uri.use
-
proxy_user = URI.decode_www_form_component(proxy_user)
-
proxy_pass = URI.decode_www_form_component(proxy_pass) end if proxy_user && proxy_pass klass = Net::HTTP::Proxy(proxy_uri.hostname, proxy_uri.port, proxy_user
ただ、URI.decode漏れってここ以外にもいっぱいありそうな空気を感じるコードなので、修正がここだけでいいのか不安を感じています。
Updated by shyouhei (Shyouhei Urabe) almost 8 years ago
- Related to Feature #12921: Retrieve user and password for proxy from env added