【问题标题】:How do I test my application's response to malformed URLs?如何测试我的应用程序对格式错误的 URL 的响应?
【发布时间】:2025-11-21 10:35:02
【问题描述】:

在开发和测试环境中,我们并没有真正看到任何格式错误的 URL,但在现实世界中,应用程序经常被编写不佳的爬虫、尝试 SQL 注入攻击的人等从应用程序请求格式错误的 URL (未转义的标点符号等)。

我发现从格式错误的 URL 请求我的网站是一个错误,所以我去修复错误并为它编写测试。下面是一个测试示例:

  scenario "with a garbage URL" do
    visit "/<<"

    # my actual expectation is irrelevant to this question
    expect(some_result).to have_happened
  end

这里的问题是visit "/&lt;&lt;" 在测试工具中抛出了一个异常,而我的应用程序永远不会受到攻击,因为 Capybara 会拒绝访问格式错误的 URL。

那么,测试我的应用程序是否正确回复了测试工具不会生成的格式错误的 URL、无效的查询字符串等的最佳方法是什么?

【问题讨论】:

    标签: ruby-on-rails rspec capybara


    【解决方案1】:

    在测试中,发送到您的应用程序的格式错误的 URL 部分是主机名之后的部分。如果您希望 URL 的那部分格式不正确,您仍然需要提供您的工具可以解析的 URL。这意味着包括方案和主机名,所以很明显你只是传递了一个格式错误的路径。

    代替

    visit "/<<"
    

    使用

    visit "http://testing.example.com/<<"
    

    【讨论】:

    • 即使指定了完整的 URL,capybara 本身(而不是我的应用程序)也会引发异常。我的应用程序从未看到它。
    • 您需要更好地定义“格式错误的 URL”的含义。如果 URL 没有指定有效的主机或方案,那么它将无法使用,但这样的 URL 也不会进入您的应用程序。 path 组件几乎可以包含任何东西,所以它应该不是问题。如果你想发送一个不是有效 HTTP 请求的请求,那么你需要使用 TCPSocket 之类的东西来创建一个套接字并发送你想要的任何数据。
    【解决方案2】:

    您可能应该将此测试编写为请求规范(没有 Capybara)而不是功能/系统规范 - 请参阅 https://relishapp.com/rspec/rspec-rails/docs/request-specs/request-spec

    【讨论】:

    • 即使在请求规范中,也是测试工具本身抛出了 URI::InvalidURIError,所以我的应用程序永远没有机会看到它。
    最近更新 更多