为什么我不能安全地在 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)
背景:我开始做的事情如下;
- 从 visual studio 2013 年开始,新的空 MVC 应用程序
- 在控制器文件夹中,右键单击添加新控制器,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" 的更好选择是完全省略该词。
我想在 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)
背景:我开始做的事情如下;
- 从 visual studio 2013 年开始,新的空 MVC 应用程序
- 在控制器文件夹中,右键单击添加新控制器,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.
我同意