request.body.split('&').each отображает неопределенный метод `each' для nil:NilClass

Когда я запускаю следующую часть своего кода, появляется ошибка «неопределенный метод `каждый’ для nil: NilClass».

if request and request.body
  print_status(request.body);
  request.body.split('&').each { |var|
    parts = var.split('=', 2)
    if parts.length != 2
      print_error("Weird, we got a var that doesn't contain an equals: #{parts.inspect}")
    else
      fln,fld = parts
      fld = Rex::Text.uri_decode(fld)
      if fln == "script"
        script = fld
      end
    end
  }
end


Некоторые тесты с request.body:

- ----------------------------------
- request.body.class: String
- request.body: script=test
- request.body.split('&'): ["script=test"]
- Sending
- ----------------------------------
- request.body.class: String
- request.body: script=alert%28%27ok%27%29%3B
- request.body.split('&'): ["script=alert%28%27ok%27%29%3B"]
- Sending
- ----------------------------------
- request.body.class: String
- request.body: script=alert%28%27ok%27%29%3B%3D
- request.body.split('&'): ["script=alert%28%27ok%27%29%3B%3D"]
- Exception handling request: undefined method `each' for nil:NilClass
- ----------------------------------
- request.body.class: String
- request.body: script=alert%28%27ok%27%29%3B%5D
- request.body.split('&'): ["script=alert%28%27ok%27%29%3B%5D"]
- Exception handling request: undefined method `each' for nil:NilClass
- ----------------------------------
- request.body.class: String
- request.body: script=alert%28%27ok%27%29%3B-
- request.body.split('&'): ["script=alert%28%27ok%27%29%3B-"]
- Exception handling request: undefined method `each' for nil:NilClass
- ----------------------------------
- request.body.class: String
- request.body: script=alert%28%27ok%27%29%3B+
- request.body.split('&'): ["script=alert%28%27ok%27%29%3B+"]
- Exception handling request: undefined method `each' for nil:NilClass

Большинство специальных символов вызывают ошибку.
Что может быть не так?


person Robert    schedule 14.02.2014    source источник
comment
Что такое request.body? Строка?   -  person Marek Lipka    schedule 14.02.2014
comment
Действительно ли строка request.body.split('&').each вызывает исключение? Я не вижу здесь проблемы, если request.body.split('&') всегда является строкой.   -  person Maksim Gladkov    schedule 14.02.2014
comment
request.body.split('&') возвращает массив из 1 элемента. Да, он единственный на весь файл rb.   -  person Robert    schedule 14.02.2014
comment
Это может быть определено где-то еще. Не могли бы вы опубликовать свою обратную связь? (например, внутри метода Rex::Text.url_encode может быть each). Split всегда возвращает массив, поэтому он должен быть где-то еще.   -  person BroiSatse    schedule 14.02.2014
comment
Внутри Rex::Text нет метода url_encode. Есть uri_encode/uri_decode. Проверьте исходники: dev.metasploit.com/api/Rex/Text. html#uri_encode-class_method dev.metasploit.com/api /Rex/Text.html#uri_decode-class_method   -  person Robert    schedule 14.02.2014
comment
Я пытался поместить обработчик исключений в backtrrace (с begin и save => e), но он не улавливает исключение. Я не знаю почему.   -  person Robert    schedule 14.02.2014
comment
Ты прав. Проблема не в этом коде. После выполнения этого будут следующие вызовы: js = ::Rex::Exploitation::JSObfu.new %Q| #{скрипт} js.obfuscate | проблема внутри метода js.obfuscate. Именно в этой функции: dev.metasploit.com/api/Rex /Эксплуатация/   -  person Robert    schedule 14.02.2014


Ответы (1)


Пожалуйста, попробуйте использовать request.body.read вместо request.body.

ActionDispatch::Request.body — метод StringIO, см.: http://api.rubyonrails.org/classes/ActionDispatch/Request.html#method-i-body

person Maksim Gladkov    schedule 14.02.2014
comment
Отображает запрос на обработку исключений: неопределенный метод `read' для script=alert%28%27ok%27%29%3B:String - person Robert; 14.02.2014
comment
если request.body имеет значение script=alert%28%27ok%27%29%3B, оно работает, если это script=alert%28%27ok%27%29%3B%3D, оно не работает. - person Robert; 14.02.2014
comment
И в обоих случаях это строка? - person Maksim Gladkov; 14.02.2014
comment
Да, я проверил, и в обоих случаях request.body.class является строкой. - person Robert; 14.02.2014
comment
Тогда ваш раскол должен работать и возвращать массив, я думаю. Можете ли вы предоставить больше примеров возвращаемых значений из request.body.split('&')? - person Maksim Gladkov; 14.02.2014