ruby on rails - seguridad - ¿Cómo puedo analizar fácilmente una URL con parámetros en una prueba de Rails?
seguridad en ruby on rails (2)
Quieres Addressable para esto.
uri = Addressable::URI.parse("http://example.com/?var=value")
uri.query_values # => {"var"=>"value"}
uri.query_values = {"one" => "1", "two" => "2"}
uri.to_s # => "http://example.com/?two=2&one=1"
Manejará automáticamente todas las reglas de escape por usted, y tiene algunas otras características útiles, como no lanzar excepciones para URI perfectamente válidas pero oscuras como el analizador de URI incorporado.
Tengo un código que incrusta una URL return_to
en una redirección (como OpenID) que quiero probar:
def test_uses_referrer_for_return_to
expected_return_to = ''http://test.com/foo''
@request.env[''HTTP_REFERER''] = expected_return_to
get :fazbot
# @response.redirected_to looks like http://service.com?...&return_to=[URI-encoded version of URL above]&...
encoded_return_to = (something_here)[:return_to]
assert_equal expected_return_to, URI.unencode(encoded_return_to)
end
Es un Rails ActionController::TestCase
, así que tengo acceso a todo tipo de métodos de ayuda; Simplemente no puedo encontrar la correcta
Por supuesto, podría usar URI.parse
para obtener la parte de parámetros de la URL, luego dividirlo en /&|?/
Y luego dividir nuevamente en ''=''
, pero espero que esto ya esté hecho para mí. Además, ¿qué pasa si me olvido de alguna regla oscura en el escape de URL o el análisis de parámetros? Tiene que haber algo en ActionPack
o ActiveSupport
para hacer esto, pero no puedo encontrarlo.
Gracias :)
CGI::parse(querystring)
analizará una cadena de consulta en un hash. Luego, CGI::unescape(string)
deshará cualquier codificación de URL en el valor.
Alternativamente, puedes usar Rack::Utils.parse_query
y Rack::Utils.unescape
si estás en una versión reciente de Rails basada en Rack, y quieres ser súper moderno.
No tengo conocimiento de ningún método auxiliar específico de Rails que envuelva estas funciones de utilidad, pero son bastante fáciles de usar, y CGI o Rack ya están cargados en el entorno de Rails de todos modos.