当前位置: 首页 > Web前端 > JavaScript

JavaScript如何验证URL

时间:2023-03-27 10:36:06 JavaScript

前言当开发者需要针对不同目的处理不同形式的URL,例如浏览器历史导航、锚点目标、查询参数等,我们往往会求助于JavaScript。但是,它的频繁使用会鼓励攻击者利用其漏洞。这种被利用的风险是我们必须在我们的JavaScript应用程序中实施URL验证的原因。URL验证检查URL是否遵循正确的URL语法,这是每个URL必须具有的结构。URL验证可以保护我们的应用程序免受基于URL的漏洞的侵害,例如恶意脚本注入和服务器端请求伪造(SSRF)。当我们在获取远程资源时不应用安全编码实践来验证用户提供的URL时,恶意行为者可以利用SSRF攻击。URL验证URL验证的存在是为了增强安全性、防止可能的漏洞并消除运行代码时出现任何错误的可能性。但是我们什么时候应该使用URL验证,我们在这个过程中验证什么?我们应该在所有必须识别和验证网页、图像、gif和视频等资源的软件中实施URL验证。一个典型的URL包括多个段,例如协议、域名、主机名、资源名称、URL来源、端口等。这些用于告诉浏览器如何跟踪指定的资源。我们可以通过不同的方式验证URL:使用正则表达式文字和构造函数URL构造函数isValidURL方法输入元素锚标记方法典型的URL验证方案从用户那里获取输入并解析它以识别其组成部分。验证方案确保所有URL组件都符合Internet标准。例如,如果需要,它可以检查URL是否使用安全协议。主机名验证首先将主机名分解为单独的标签,以确保它们符合顶级域规范。典型的主机名至少由两个由点分隔的标签组成。例如,www.snyk.com具有“www”、“snyk”和“com”的标签。无论大小写如何,每个标签只能包含一个字母数字字符或一个连字符。然后,验证方案可以确保主机名与允许的URL列表相匹配,确保只允许指定的URL,并且允许的URL不会被错误地取消资格。默认情况下允许URL中使用的大多数资源的路径。但是,端口只能在1到65536的范围内。超出此范围的任何内容都会引发错误。我们还可以通过检查数字IP地址来确定它是IPV4地址还是IPV6地址。最后,我们还可以检查URL的用户名和密码。此功能有助于遵守公司政策和凭证保护。现在您已经掌握了基础知识,让我们看一下使用javascript进行URL验证。如何执行URL验证在JavaScript中,执行URL验证的最简单方法是使用新的URL构造函数。除此之外,Node.js运行时和大多数浏览器都支持它。基本语法如下:newURL(url)newURL(url,base)如果提供了相对URL,JavaScript只需要base元素。如果未提供相对URL,则默认为未定义。此外,如果您提供带有绝对URL的基本元素,JavaScript会忽略该基本元素。为了验证URL,可以使用以下代码:functioncheckUrl(string){letgivenURL;try{givenURL=newURL(string);}catch(error){console.log("erroris",error);返回假;}returntrue;}此函数用于检查URL的有效性。当URL有效时返回true,否则返回false。如果您将www.urlcheck.com传递给此函数,它将返回false。因为该参数不是有效的URL。正确的版本应该是https://urlcheck.com。另一个例子是mailto:John.Doe@example.com。这是一个有效的URL,但如果您删除冒号,JavaScript将不再将其视为URL。第三个例子是ftp://。这不是有效的URL,因为不包括主机名。如果您添加两个点(..),它将成为一个有效的URL。因为点将被视为主机名,这意味着ftp://..成为有效的URL。重要的是要记住非常规但完全有效的URL是存在的!它们对于使用它们的开发人员来说可能出乎意料,但在其他方面是完全合适的。例如,以下URL均返回true:newURL("youtube://a.b.c.d");newURL("a://1.2.3.4@1.2.3.4");这些示例提醒我们,开发人员应该依赖URL验证原则,而不是关注约定。如果你想确保一个有效的URL包含一些特定的URL方案,你可以使用下面的函数:functioncheckHttpUrl(string){letgivenURL;试试{givenURL=newURL(string);}catch(error){console.log("错误是",error)returnfalse;}返回givenURL.protocol==="http:"||givenURL.protocol==="https:";}此函数验证URL,然后检查URL是使用HTTP还是HTTPS。在这里,ftp://..将被视为无效,因为它不包含HTTP或HTTPS,而http://..仍然有效。使用URL构造函数的其他一些方法包括:letm='';leta=newURL("/",m);上面的例子使用了base元素。记录这个值,我们就可以得到https://snyk.io/。要在不指定基本参数的情况下返回URL对象,语法为:letb=newURL(m);为主机添加路径名,我们的代码结构如下:letd=newURL('/en-US/docs',b);存储在变量d上的URL是https://snyk.io/en-US/docs。URL模块的另一个功能是它实现了WHATWGURLAPI,符合WHATWGURL标准供浏览器使用:letadr=newURL("");lethost=adr.host;letpath=adr.pathname;在上面的例子中,我们创建了一个名为adr的URL对象。接下来,代码获取URL的主机和路径名,分别是snyk.io和/en-US/docs。最后,我们可以将URL与允许列表或黑名单进行比较,以确保只允许特定的URL。如何使用正则验证另一种验证URL的方法是使用正则表达式(regex)。我们可以使用Regex来检查URL是否有效。使用正则表达式进行URL验证的JavaScript语法是:functionisValidURL(string){varres=string.match(/(https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|www\.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9]+\.[^\s]{2,}|www\.[a-zA-Z0-9]+\.[^\s]{2,})/gi);返回(res!==null);};测试一些URL:vartc1=""console.log(isValidURL(tc1));由正则表达式定义的URL语法,用于检查URL是否以http://或https://开头或子域,以及是否包含域名。控制台上的语句计算结果为真,因为它遵循正则表达式定义的URL语法。相反,以下语句将返回false,因为它不以任何允许的方案或子域开头,也不包含域名:vartc4="helloWorld";控制台日志(isValidURL(tc4));上面的正则表达式相对简单,但导航起来仍然很棘手。这也是一种容易出错的方法,因为正则表达式无法充分处理验证URL的规则。它最多只能匹配有效的URL。此外,当正则表达式包含复杂的验证逻辑或接收冗长的输入字符串时,执行验证检查会变得非常耗时。为了满足定义的正则表达式验证检查,浏览器必须在输入字符串中回溯数百万次。如此多的回溯检查会导致“灾难性回溯”,这是一种复杂的正则表达式冻结浏览器或淹没CPU核心进程的现象。安全地使用JavaScript正如将SSRF添加到新的OWASPTop10中所证明的那样,URL验证对于JavaScript应用程序的安全性变得越来越重要。幸运的是,我们可以通过在服务器端验证URL来帮助减轻此类攻击。此外,根据您首选的验证和处理URL的方式,使用新的URL功能可能会有所帮助。在看到新URL函数的一些用例后,我们了解了如何使用正则表达式验证URL——并了解了为什么这种方法很麻烦且容易出错。URL的安全风险与其说是它们的有效性,不如说是危险的URL方案。因此,我们需要确保服务器端的应用程序进行身份验证。攻击者可以绕过客户端的身份验证机制,因此仅依靠它不是解决方案。以上就是本文的全部内容。如果对你有帮助,请点赞、收藏、转发~