前言当开发者需要针对不同目的处理不同形式的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='
