apache URL编码的冒号(%3A)在403中解析

mw3dktmi  于 2023-01-26  发布在  Apache
关注(0)|答案(1)|浏览(256)

我在Apache服务器(典型的xampp包)中托管了一些rest API。
当我使用http方法攻击资源时(无论哪种:put,post,get...),并且URL包含编码的冒号%3A,服务器有时会回复403错误。这似乎取决于服务器的文件夹结构。如果存在一个现有文件夹,并且您的URL攻击该文件夹中包含%3A的资源,服务器会返回403。如果不包含%3A,则会返回404。
有这样的结构

htdocs/apis/userContext
htdocs/apis/subscriptions

http://localhost/apis/userContext/users/tel%3A2032342349 Works (returns 404 not found, because users doesn't exist)
http://localhost/apis/userContext/tel%3A2032342349 Doesn't work (returns 403)
http://localhost/subscriptions/tel%3A2032342349 Doesn't work (returns 403)
http://localhost/nonexistingfolder/tel%3A2032342349 works (returns 404, becasue nonexistingfolder doesn't exist)

这是相当烦人的,因为许多将出现在url中的值都是telURI,看起来像这样

tel:+34678678678

所以请不要告诉我不要用冒号,因为那是不可能的,我该怎么做呢?

dfuffjeb

dfuffjeb1#

我只能找到一个有效的信息,这(从2006年10月)-在这里。
显然,这个错误不会出现在Linux上,它会发生在Windows平台上。根据源代码,一个简短的名称,后面跟着冒号(:)可以被解释为驱动器名(为什么会这样,为什么file://不表示这一点-我不知道)。
我不得不解决这个问题,但我可以自己设置链接(不知道你是否有奢侈品)。我的解决方案是:

  • 将URI中的冒号替换为所选字符(我选择了下划线)-urlencode($uri) → urlencode(strtr($uri, ":", "_"))
  • 在应用相同的替换-SELECT ... FROM ... WHERE uri = REPLACE(@@uri, ":", "_")后搜索这些URI

相关问题