[解決済み] Railsのrequest.remote_ipとrequest.ipの違いは何ですか?
2023-06-27 15:47:19
質問
タイトルの通り、どちらの方法でもクライアントのipを取得することができます。何か違いがあるのでしょうかね。よろしくお願いします。
のソースコードに
"/usr/local/rvm/gems/ruby-1.9.3-p194/gems/actionpack-3.2.3/lib/action _dispatch/http/request.rb" 257L, 8741C
def ip
@ip ||= super
end
# Originating IP address, usually set by the RemoteIp middleware.
def remote_ip
@remote_ip ||= (@env["action_dispatch.remote_ip"] || ip).to_s
end
が、その意味するところは本当にわかりません。
どのように解決するのですか?
ソースから。
module ActionDispatch
class Request < Rack::Request
# ...
def ip
@ip ||= super
end
def remote_ip
@remote_ip ||= (@env["action_dispatch.remote_ip"] || ip).to_s
end
# ...
end
end
ここで Rack::Request は次のようになります。
module Rack
class Request
def ip
remote_addrs = split_ip_addresses(@env['REMOTE_ADDR'])
remote_addrs = reject_trusted_ip_addresses(remote_addrs)
return remote_addrs.first if remote_addrs.any?
forwarded_ips = split_ip_addresses(@env['HTTP_X_FORWARDED_FOR'])
if client_ip = @env['HTTP_CLIENT_IP']
# If forwarded_ips doesn't include the client_ip, it might be an
# ip spoofing attempt, so we ignore HTTP_CLIENT_IP
return client_ip if forwarded_ips.include?(client_ip)
end
return reject_trusted_ip_addresses(forwarded_ips).last || @env["REMOTE_ADDR"]
end
end
end
そこで
remote_ip
が優先されます。
action_dispatch.remote_ip
. それが設定されているのは
ActionDispatch::RemoteIp
というミドルウェアで設定されています。そのミドルウェアのソースを見ると、呼び出されるときにスプーフィング攻撃をチェックしていることがわかります。
GetIp.new
を呼び出してenv変数をセットしています。そのために必要なのが
remote_ip
はローカルのプロキシを通しても IP アドレスを読み取るため、 Clowerweb が説明しているように、これが必要です。
関連
-
[解決済み】bcrypt LoadError: Cannot load such file
-
[解決済み] Errno::EACCESS: パーミッションが拒否された @ dir_s_mkdir
-
[解決済み] Railsマイグレーションを利用してカラムをドロップする方法
-
[解決済み] nil:NilClass の未定義メソッド `each'... なぜ?
-
[解決済み] Rails 4で、以前のバージョンのRailsでattr_accessibleを使用していた状況に遭遇した場合、Forbidden Attributes Errorが発生する。
-
[解決済み] 未初期化の定数 "コントローラ名"
-
[解決済み] 属性とカラムの違いは何ですか?
-
[解決済み] Ruby on Railsで現在の絶対URLを取得するにはどうすればよいですか?
-
[解決済み] イコール、エクル、==、==の違いは何ですか?
-
[解決済み】Railsの認証トークンを理解する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】なぜRuby on Railsは、http://localhost:3000 の代わりに http://0.0.0.0:3000 を使用するのですか?
-
[解決済み】Rails: sudo "コマンドが認識されないのはなぜですか?
-
[解決済み] rake db:migrateを使って1ステップだけロールバックする方法
-
[解決済み] Ruby on rails "No route matches" (ルートに一致するものがない)。
-
[解決済み] erbでコメントを追加する最適な方法
-
[解決済み] PG::ConnectionBad - サーバーに接続できませんでした。接続が拒否されました。
-
[解決済み] Rails / Haml: 投稿フォームを作成するには?
-
[解決済み] 属性を割り当てる場合、引数としてハッシュを渡す必要がある
-
[解決済み] Heroku: 既存のrailsアプリにseeds.rbをプッシュする方法?
-
[解決済み] レイル 4 radio_button_tag default not selected