我有一个Angular 1应用,其中包含用于创建网站通知的表单输入。
用户可以输入完整网址http://example.com
,也可以输入应用内的路径/foo/barboo
但是,攻击者也可以输入javascript:alert(1);//
,当按下通知链接时,JS将会触发。
是否可以对此输入进行编码,但仍允许对其进行处理?
答案 0 :(得分:2)
这是一个正则表达式,它将匹配以模式(http / https / ftp)开头的URI和以斜杠开头的“相对”URI:
/((\/[\w-.]+)(\/[\w-.]+)*\/?)|(((http|ftp|https):\/\/)?[\w-]+(\.[\w-]+)+([\w.,@?^=%&:\/~+#-]*[\w@?^=%&\/~+#-])?)/gi
const re = /((\/[\w-.]+)(\/[\w-.]+)*\/?)|(((http|ftp|https):\/\/)?[\w-]+(\.[\w-]+)+([\w.,@?^=%&:\/~+#-]*[\w@?^=%&\/~+#-])?)/gi
console.log("https://example.com/foo/bar".match(re)[0]); //matches
console.log("/foo/bar/baz/bim".match(re)[0]); //matches
console.log("javascript:alert('xss');//".match(re)); //doesn't match (null)
console.log("/foo/bar/baz/bim.html".match(re)[0]); //matches
console.log("https://example.com/foo/bar-api.php?e=mc2".match(re)[0]); //matches