- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
当开发者需要为不同目的以不同形式处理URL时,比如说浏览器历史导航,锚点目标,查询参数等等,我们经常会借助于JavaScript。然而,它的频繁使用促使攻击者利用其漏洞。这种被利用的风险是我们必须在我们的JavaScript应用程序中实现URL验证的原因.
URL验证检查URL是否遵循正确的URL语法,也就是每个URL必须具备的结构。URL验证可以使我们的应用程序免遭基于URL的漏洞,比如恶意脚本注入和服务器端请求伪造(SSRF)。当我们在获取远程资源时没有应用安全编码惯例来验证用户提供的URL时,恶意行为者可以采用SSRF攻击.
URL验证的存在是为了加强安全,防止可能存在的漏洞,并消除运行代码时产生的任何错误的机会。但是我们应该在什么时候使用URL验证,在这个过程中我们要验证什么呢?我们应该在所有必须识别和验证诸如网页、图片、gif和视频等资源的软件中实施URL验证.
一个典型的URL包括多个片段,比如协议、域名、主机名、资源名、URL源、端口等等。这些用来告诉浏览器如何追踪指定的资源。我们可以以不同的方式来验证URL:
isValidURL
方法 一个典型的URL验证方案接收来自用户的输入,然后对其进行解析,以识别其各个组成部分。验证方案可以确保所有的URL组件符合互联网标准。例如,如果需要,它可以检查URL是否使用安全协议.
主机名验证首先是将主机名分成独立的标签,以确保它们符合顶级域名规范。一个典型的主机名由至少两个用点分隔的标签组成。例如, www.snyk.com 有 "www"、"snyk"和 "com"的标签。每个标签只能由一个字母数字字符或一个连字符组成,无论大小写。然后,验证方案可以确保主机名与URL的允许列表相匹配,以确保只允许指定的URL,并且允许的URL不会被错误地取消资格.
默认情况下,URL中使用的大多数资源的路径都是允许的。然而,端口只能在1到65536的范围内。任何超出这个范围的东西都应该抛出一个错误。我们还可以检查数字IP地址,以判断它是一个IPV4地址还是IPV6地址.
最后,我们也可以检查URL的用户名和密码。这个功能有助于遵守公司政策和凭证保护.
现在,你已经有了这些基础知识,让我们来看看使用javascript的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核心进程爆满.
正如SSRF被添加到新的OWASP Top 10中所证明的那样,URL验证对于JavaScript应用程序的安全性已经变得越来越关键。幸运的是,我们可以通过在服务器端验证URL来帮助缓解此类攻击。此外,根据验证和处理URL的首选方式来使用 new URL 函数会非常有益.
在看到 new URL 函数的一些使用案例后,我们学习了如何用正则表达式验证一个URL--并看到了为什么这种方法很麻烦而且容易出错.
URL的安全风险与其说是关于其有效性,不如说是关于危险的URL方案。因此,我们需要确保让服务器端的应用程序进行验证。攻击者可以绕过客户端的验证机制,所以仅仅依靠它并不是解决办法.
以上就是本文的所有内容,如果对你有所帮助,欢迎点赞、收藏、转发~ 。
最后此篇关于JavaScript如何验证URL的文章就讲到这里了,如果你想了解更多关于JavaScript如何验证URL的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我有一个 html 格式的表单: 我需要得到 JavaScript在value input 字段执行,但只能通过表单的 submit .原因是页面是一个模板所以我不控制它(不能有
我管理的论坛是托管软件,因此我无法访问源代码,我只能向页面添加 JavaScript 来实现我需要完成的任务。 我正在尝试用超链接替换所有页面上某些文本关键字的第一个实例。我还根据国家/地区代码对这些
我正在使用 JS 打开新页面并将 HTML 代码写入其中,但是当我尝试使用 document.write() 在新页面中编写 JS 时功能不起作用。显然,一旦看到 ,主 JS 就会关闭。用于即将打开的
提问不是为了解决问题,提问是为了更好地理解系统 专家!我知道每当你将 javascript 代码输入 javascript 引擎时,它会立即由 javascript 引擎执行。由于没有看过Engi
我在一个文件夹中有两个 javascript 文件。我想将一个变量的 javascript 文件传递到另一个。我应该使用什么程序? 最佳答案 window.postMessage用于跨文档消息。使
我有一个练习,我需要输入两个输入并检查它们是否都等于一个。 如果是 console.log 正则 console.log false 我试过这样的事情: function isPositive(fir
我正在做一个Web应用程序,计划允许其他网站(客户端)在其页面上嵌入以下javascript: 我的网络应用程序位于 http://example.org 。 我不能假设客户端网站的页面有 JQue
目前我正在使用三个外部 JS 文件。 我喜欢将所有三个 JS 文件合而为一。 尽一切可能。我创建 aio.js 并在 aio.js 中 src="https://code.jquery.com/
我有例如像这样的数组: var myArray = []; var item1 = { start: '08:00', end: '09:30' } var item2 = {
所以我正在制作一个 Chrome 扩展,它使用我制作的一些 TamperMonkey 脚本。我想要一个“主”javascript 文件,您可以在其中包含并执行其他脚本。我很擅长使用以下行将其他 jav
我有 A、B html 和 A、B javascript 文件。 并且,如何将 A JavaScript 中使用的全局变量直接移动到 B JavaScript 中? 示例 JavaScript) va
我需要将以下整个代码放入名为 activate.js 的 JavaScript 中。你能告诉我怎么做吗? var int = new int({ seconds: 30, mark
我已经为我的 .net Web 应用程序创建了母版页 EXAMPLE1.Master。他们的 I 将值存储在 JavaScript 变量中。我想在另一个 JS 文件中检索该变量。 示例1.大师:-
是否有任何库可以用来转换这样的代码: function () { var a = 1; } 像这样的代码: function () { var a = 1; } 在我的浏览器中。因为我在 Gi
我收到语法缺失 ) 错误 $(document).ready(function changeText() { var p = document.getElementById('bidp
我正在制作进度条。它有一个标签。我想调整某个脚本完成的标签。在找到可能的解决方案的一些答案后,我想出了以下脚本。第一个启动并按预期工作。然而,第二个却没有。它出什么问题了?代码如下: HTML:
这里有一个很简单的问题,我简单的头脑无法回答:为什么我在外部库中加载时,下面的匿名和onload函数没有运行?我错过了一些非常非常基本的东西。 Library.js 只有一行:console.log(
我知道 javascript 是一种客户端语言,但如果实际代码中嵌入的 javascript 代码以某种方式与在控制台上运行的代码不同,我会尝试找到答案。让我用一个例子来解释它: 我想创建一个像 Mi
我如何将这个内联 javascript 更改为 Unobtrusive JavaScript? 谢谢! 感谢您的回答,但它不起作用。我的代码是: PHP js文件 document.getElem
我正在寻找将简单的 JavaScript 对象“转储”到动态生成的 JavaScript 源代码中的最优雅的方法。 目的:假设我们有 node.js 服务器生成 HTML。我们在服务器端有一个对象x。
我是一名优秀的程序员,十分优秀!