为什么我不能安全地在 webapi 路由中允许“*”字符? (或者,如果可以,怎么做?)

Why can't I allow '*' characters in webapi routes safely? (or, if it can, how?)

我想在 MVC5 项目中使用 webapi 2(AngularJS,但这不会有任何区别)来创建以下类型的路由

        GET api/animals/cats => return cats
        GET api/animals/dogs => return dogs            
        GET api/animals/* => return all animals (e.g. cats+dogs)

背景:我开始做的事情如下;

  1. 从 visual studio 2013 年开始,新的空 MVC 应用程序
  2. 在控制器文件夹中,右键单击添加新控制器,select WebApi 2 控制器

(抱歉,如果这看起来信息太多,这里只是为了防止不同的项目类型导致不同的非法字符检查。)

我希望能够让用户传入一个'*'字符来表示一个通配符,表示所有种动物。为此,我使用 webapi 注册了以下测试路线;

        config.Routes.MapHttpRoute(
            name: RouteNames.Animals,
            routeTemplate: "api/animals/{animal}",
            defaults: new { id = RouteParameter.Optional, controller = "AnimalsApi" }
        );

当我使用邮递员对此进行测试时,我收到 400 bad request response,并显示以下错误消息;

A potentially dangerous Request.Path value was detected from the client (*).

我读过一些相关的博文,由于各种原因暗示这个角色是邪恶的,有些引用 W3.org,但是,rfc1738 spec for (Uniform Resource Locators 'URL')(第 3 页)似乎实际上允许使用未转义的“*”。摘录如下;

...Thus, only alphanumerics, the special characters "$-_.+!*'(),", and reserved characters used for their reserved purposes may be used unencoded within a URL...

也许我看错了? '*' 字符似乎得到了 W3 的祝福,但会兴高采烈地让你漂亮干净的 webapi 崩溃 restful(?) webservice。

我真的不喜欢必须使用查询参数来解决问题的语法。以下是一个快速的(恕我直言,肮脏的)修复 -> GET api/animals/?animal=* 这违背了拥有干净的路由语法的全部目的。我的问题是,为什么“”是邪恶的?即如果我允许它,通过 web.config 中的 requestPathInvalidCharacters,(只有 '' 字符,其他 'known evil' 字符的 none,那么我会怎么做有风险吗?)我会面临什么样的潘多拉魔盒黑客困境?

更新(在我接受了上面定义的问题的正确答案之后,在我睡觉之前在下面的最后一条评论之前!感谢大家的快速和准确的回复。)

如果我提出以下示例路线,可能会有更有趣的讨论; (眨眼)

api/animals/{type}/{location}/{sex}
...
GET api/animals/*/london/male  => return all male animals in london
GET api/animals/cats/*/female => return all female cats across all locations

谢谢大家!干杯,A

My question is, why is '*' evil? i.e. If I allow it, via requestPathInvalidCharacters in web.config

他们可能 special meaning:

The asterisk ("*", ASCII 2A hex) and exclamation mark ("!" , ASCII 21 hex) are reserved for use as having special signifiance within specific schemes.

我同意 ,"anything" 的更好选择是完全省略该词。