在我们一般开发中,可能会使用以下简单的正在方式验证是否为 URL。
const url = '';
const reg = /(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?/;
if(!reg.test(url)){
// 不是url
}
上面的方法在只能简单验证是否是 http,ftp,https 开头,无法强校验 URL 里的详细参数,别有用心之人会通过此缺陷进行注入,因为通过以下优化的方法,可以更高层度的校验 URL 的安全性,是否符合规则。
const url = '';
function checkUrl(url){
const reg = "^((https|http|ftp|rtsp|mms)?://)"
+ "?(([0-9a-z_!~*'().&=+$%-]+: )?[0-9a-z_!~*'().&=+$%-]+@)?" //ftp的user@
+ "(([0-9]{1,3}\.){3}[0-9]{1,3}" // IP形式的URL- 192.168.0.1
+ "|" // 允许IP和Domain(域名)
+ "([0-9a-z_!~*'()-]+\.)*" // 域名- www.
+ "([0-9a-z][0-9a-z-]{0,61})?[0-9a-z]\." // 二级域名
+ "[a-z]{2,6})" // First level domain- .COM or .museum
+ "(:[0-9]{1,4})?" // 端口- :80
+ "((/?)|" // a slash isn't required if there is no file name
+ "(/[0-9a-z_!~*'().;?:@&=+$,%#-]+)+/?)$";
var re = new RegExp(reg);
if (re.test(url)){
return (true);
}else{
return (false);
}
}
if(!checkUrl(url)){
// 不是url
}