Apache UrlValidator将URL视为无效

时间:2016-09-26 18:13:29

标签: java apache validation url

问题是我们的前端认为这个网址有效,而后端认为不是。 网址是 http://pyxlmedia.com/pc/talk=now&o=http://mobile.tmall.com/mobile

你可以看到,在pc之后,它是一个' /'而不是'?'。

如果我改变' /'到'?'然后两个通过,即

http://pyxlmedia.com/pc?talk=now&o=http://mobile.tmall.com/mobile  被两者认为是有效的  org.apache.commons.validator.routines.UrlValidator(1.5.1)和网站http://formvalidation.io/validators/uri/

测试代码是

@Test
public void test() {
    UrlValidator urlValidator = new UrlValidator(new String[] {"http", "https"});
    assertTrue(urlValidator.isValid("http://pyxlmedia.com/pc/talk=now&o=http://mobile.tmall.com/mobile"));
}

首先我想知道哪一个是错的,前端还是后端?然后如何使他们的行为保持一致?

2 个答案:

答案 0 :(得分:4)

在我分析这个问题时,我经常来回几次,但我对自己的前端在接受URL方面技术上是正确的感到满意。然而,棘手的URL可能并不意味着你认为它意味着什么,所以你的后端可能会通过标记它来帮助你。

此处的相关标准由RFC 3986提供。 (对于“http”URI方案,RFC 7230为语法稍作修改,但这些修改不会改变给定URL的分析。)根据一般的URI语法,输入URL会分成这样的组件:

计划http

(分隔符)://

权限pyxlmedia.com

路径/pc/talk=now&o=http://mobile.tmall.com/mobile

请特别注意,URL不包含查询组件,这与您提供的两个验证器都接受的变体不同。

路径组件包含五个段,并且您的后端验证器可能会跳过该组件的这些不寻常特征之一:

  • 一个段为空
  • 第二段包含未转义字符'='和'&',URI语法归类为“sub-delims”
  • 第二段包含未转义的':'字符,URI语法归类为“gen-delim”

但是,对路径组件语法的分析(RFC 3986的第3.3节)显示绝对路径中第一个以外的段被允许为空,并且':'字符和所有子delim允许在路径段中显示未转义。 (而RFC 7230也允许绝对路径的第一段也是空的。)

然而,从“我不认为这意味着你的意思”这个部门来看,我想强调的是,这条道路分为几个部分:

pc
talk=now&o=http:
(empty)
mobile.tmall.com
mobile

特别注意路径中的明显URL如何分割四个路径段。

至于如何使行为保持一致,这取决于你真正想要的行为。

Apache UrlValidator没有很多配置选项,但 所拥有的配置选项是ALLOW_2_SLASHES,它允许在URL的路径组件中加倍斜杠。我不确定是否打开该选项将足以使其接受给定的URL,但是将其禁用肯定会导致拒绝URL。如果足够并且您想接受该URL,那么您似乎需要选择或编写不同的验证器。

就其本身而言,http://formvalidation.io/validators/uri/处的验证器似乎有一组同样小但不同的配置选项,我没有看到其中一个我期望调整其对URL的评估题。因此,如果要拒绝前端的麻烦URL,则需要查找或编写不同的验证器。

答案 1 :(得分:-1)

在任何网址中,如果您使用get方法将任何变量发送到后端(通过嵌入在URL中),那么它应该被“?”分隔。从URL的其余部分。这是标准的。

例如: -

HTTPS://Google.com?search=animals