关于javascript:JavaScript-如何验证-URL

8次阅读

共计 3769 个字符,预计需要花费 10 分钟才能阅读完成。

前言

当开发者须要为不同目标以不同模式解决 URL 时,比如说浏览器历史导航,锚点指标,查问参数等等,咱们常常会借助于 JavaScript。然而,它的频繁应用促使攻击者利用其破绽。这种被利用的危险是咱们必须在咱们的 JavaScript 应用程序中实现 URL 验证的起因。

URL 验证查看 URL 是否遵循正确的 URL 语法,也就是每个 URL 必须具备的构造。URL 验证能够使咱们的应用程序免遭基于 URL 的破绽,比方歹意脚本注入和服务器端申请伪造(SSRF)。当咱们在获取近程资源时没有利用平安编码常规来验证用户提供的 URL 时,歹意行为者能够采纳 SSRF 攻打。

URL 验证

URL 验证的存在是为了增强平安,避免可能存在的破绽,并打消运行代码时产生的任何谬误的机会。然而咱们应该在什么时候应用 URL 验证,在这个过程中咱们要验证什么呢?咱们应该在所有必须辨认和验证诸如网页、图片、gif 和视频等资源的软件中施行 URL 验证。

一个典型的 URL 包含多个片段,比方协定、域名、主机名、资源名、URL 源、端口等等。这些用来通知浏览器如何追踪指定的资源。咱们能够以不同的形式来验证 URL:

  • 应用正则字面量和构造函数
  • URL 构造函数
  • isValidURL办法
  • Input 元素
  • Anchor 标签办法

一个典型的 URL 验证计划接管来自用户的输出,而后对其进行解析,以辨认其各个组成部分。验证计划能够确保所有的 URL 组件合乎互联网规范。例如,如果须要,它能够查看 URL 是否应用平安协定。

主机名验证首先是将主机名分成独立的标签,以确保它们合乎顶级域名标准。一个典型的主机名由至多两个用点分隔的标签组成。例如,www.snyk.com 有 “www”、”snyk” 和 “com” 的标签。每个标签只能由一个字母数字字符或一个连字符组成,无论大小写。而后,验证计划能够确保主机名与 URL 的容许列表相匹配,以确保只容许指定的 URL,并且容许的 URL 不会被谬误地取消资格。

默认状况下,URL 中应用的大多数资源的门路都是容许的。然而,端口只能在 1 到 65536 的范畴内。任何超出这个范畴的货色都应该抛出一个谬误。咱们还能够查看数字 IP 地址,以判断它是一个 IPV4 地址还是 IPV6 地址。

最初,咱们也能够查看 URL 的用户名和明码。这个性能有助于恪守公司政策和凭证爱护。

当初,你曾经有了这些基础知识,让咱们来看看应用 javascript 的 URL 验证吧。

如何执行 URL 验证

在 JavaScript 中,执行 URL 验证最简略的形式是应用 new URL 构造函数。除此之外,它还失去了 Node.js 运行时和大多数浏览器的反对。

根本语法如下:

new URL (url)
new URL (url , base)

如果提供绝对 URL,JavaScript 只须要 base 元素。如果不提供绝对 URL,默认为 undefined。另外,如果提供一个具备相对 URL 的base 元素,JavaScript 会疏忽 base 元素。

为了验证 URL,能够应用以下代码:

function checkUrl (string) {
  let givenURL ;
  try {givenURL = new URL (string);
  } catch (error) {console.log ("error is", error);
     return false; 
  }
  return true;
}

该函数用于查看 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 都会返回真值:

  • new URL("youtube://a.b.c.d");
  • new URL("a://1.2.3.4@1.2.3.4");

这些例子揭示咱们,开发者应该依附 URL 验证准则,而不是专一于常规。

如果你想确保无效的 URL 蕴含一些特定的 URL 计划,你能够应用以下函数:

function checkHttpUrl(string) {
  let givenURL;
  try {givenURL = new URL(string);
  } catch (error) {console.log("error is",error)
    return false;  
  }
  return givenURL.protocol === "http:" || givenURL.protocol === "https:";
}

该函数验证 URL,而后查看 URL 是否应用 HTTP 或者 HTTPS。在这里,ftp://..会被认为是有效的,因为它不蕴含 HTTP 或者 HTTPS,而 http://.. 仍旧无效。

应用 URL 构造函数的一些其余形式包含:

let m = '<https://snyk.io>';
let a = new URL("/", m);

上述示例应用了 base 元素。记录下这个值,咱们就能够失去https://snyk.io/

要返回一个 URL 对象而不指定 base 参数的话,语法是:

let b = new URL(m);

为了给主机增加一个路径名,咱们的代码构造如下:

let d = new URL('/en-US/docs', b);

存储在变量 d 上的 URL 是https://snyk.io/en-US/docs

URL 模块的另一个性能是,它实现了 WHATWG URL API,它恪守 WHATWG 的 URL 规范,供浏览器应用:

let adr = new URL("<https://snyk.io/en-US/docs>");
let host = adr.host;
let path = adr.pathname;

在下面的例子中,咱们创立了一个名为 adr 的 URL 对象。接着,代码获取 URL 的主机和路径名,别离是 snyk.io/en-US/docs。最初,咱们能够将 URL 和容许列表或者黑名单进行比照,确保只有特定 URL 是被容许的。

如何应用正则验证

另一种验证 URL 的办法是应用正则表达式(regex)。咱们能够应用 Regex 来查看 URL 是否无效。

应用 regex 进行 URL 验证的 JavaScript 语法是:

function isValidURL(string) 
  {
      var res = 
      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,}|w
      ww\.[a-zA-Z0-9]+\.[^\s]{2,})/gi);
          return (res !== null);
  };

来测试一些 URL:

var tc1 = "<http://helloworld.com>"
console.log(isValidURL(tc1));

regex 定义的 URL 语法查看 URL 是否以 http://https://或子域开始,以及是否蕴含域名。管制台上的语句后果是true,因为它遵循了由 regex 定义的 URL 语法。相同,上面的语句将返回一个false,因为它没有以任何容许的计划或子域开始,也不蕴含域名:

var tc4 = "helloWorld";
console.log (isValidURL(tc4));

下面的正则表达式绝对简略,但依然难以驾驭。这也是一个容易出错的办法,因为一个正则表达式不能充沛解决验证 URL 的规定。它最多只能做到匹配无效的 URL。此外,当一个正则表达式要么蕴含简单的验证逻辑,要么收到简短的输出字符串时,执行验证查看就变得很耗时。

为了满足定义的正则表达式验证查看,浏览器必须在输出字符串中进行数以百万计的回溯。如此多的回溯查看可能会导致 ” 灾难性的回溯 ”,这种景象是简单的正则表达式会解冻浏览器或使 CPU 外围过程爆满。

平安应用 JavaScript

正如 SSRF 被增加到新的 OWASP Top 10 中所证实的那样,URL 验证对于 JavaScript 应用程序的安全性曾经变得越来越要害。侥幸的是,咱们能够通过在服务器端验证 URL 来帮忙缓解此类攻打。此外,依据验证和解决 URL 的首选形式来应用 new URL 函数会十分无益。

在看到 new URL 函数的一些应用案例后,咱们学习了如何用正则表达式验证一个 URL– 并看到了为什么这种办法很麻烦而且容易出错。

URL 的平安危险与其说是对于其有效性,不如说是对于危险的 URL 计划。因而,咱们须要确保让服务器端的应用程序进行验证。攻击者能够绕过客户端的验证机制,所以仅仅依附它并不是解决办法。

以上就是本文的所有内容,如果对你有所帮忙,欢送点赞、珍藏、转发~

正文完
 0