首页 > JavaScript 语言精粹关于解析 URL 正则问题

JavaScript 语言精粹关于解析 URL 正则问题

第68页讲解url的正则

var parse_url = /^(?:(A-Za-z)+:)?(\/{0,3})(0-9.\-A-Za-z]+)(?::(\d+))?**(?:\/([^?#]*))**?(?:\?([^#]*))?(?:#(.*))?$/;

(?:\/([^?#]*)) 这个 [^?#] 会有渗漏的风险。
请问:

  1. 什么时候会有这种风险呢?
  2. 严谨的url正则应该怎么写?
  3. 为什么schema后面匹配的是(\/{0,3})?

一、会有什么风险
刚好jQuery源码中也有匹配URL相关的正则表达式,看这里http://bugs.jquery.com/ticket/9521
就会知道不安全的#可能会引起xss问题。
有一个例子提到如果在url的后面有这么一段hash#p=<img src%3D/%20onerror%3Dalert(1)>,而由于src指向的地址不存在就会触发后面的onerror监听函数,那么就可以做其他坏事了,举例这里只是alert(1)
参考: https://twitter.com/bulkneets/statuses/156620076160786432

三、schema后面为什么是0-3个的/
1. 如果省略掉了前面schema了,那么/可能就是不需要的
如没有http:就可以不要//了,直接www.baidu.com就好了,不用http://www.baidu.com

  1. 有了schema后,后跟两个/就比较常见了,如http://, ftp://

  2. 一个/的情况,可能是相对路径吧,举例就像~/user/123

  3. 三个/的情况,其实是file:///

【热门文章】
【热门文章】