getRequestURI VS getServletPath

Servlet 3.1.0 在 Tomcat 容器里面,getRequestURI() 和 getServletPath() 的返回值是有区别的。

举个例子,黑客在提交时候故意多加一个斜杠 https://api.com//users/userinfo,这里有2个斜杠,Server 会正常相应。

  • getRequestURI():拿到的是原封不动的浏览器请求地址,返回就是 //users/userinfo,再用 startsWith “/users” 比较,就容易出错,要进去的校验逻辑进不去,就要发生被绕过。

  • getServletPath():拿到就是正确地址,虽然浏览器地址 https://api.com//users/userinfo,但后台拿到仍然是 /users/userinfo 一个斜杠,再用 startsWith “/users” 比较,不会被绕过。

所以,要 startsWith 比较白名单 URLs 的时候,建议用 getServletPath() 去拿。

作者:殷建卫 链接:https://www.yuque.com/yinjianwei/vyrvkf/egt89x 来源:殷建卫 - 架构笔记 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。