第68页讲解url的正则
var parse_url = /^(?:(A-Za-z)+:)?(\/{0,3})(0-9.\-A-Za-z]+)(?::(\d+))?**(?:\/([^?#]*))**?(?:\?([^#]*))?(?:#(.*))?$/;
说 (?:\/([^?#]*))
这个 [^?#]
会有渗漏的风险。
请问:
- 什么时候会有这种风险呢?
- 严谨的url正则应该怎么写?
- 为什么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
有了schema后,后跟两个
/
就比较常见了,如http://
,ftp://
;一个
/
的情况,可能是相对路径吧,举例就像~/user/123
三个
/
的情况,其实是file:///